根据我的理解,信号量应该可以跨相关进程使用,而无需将其放置在共享内存中。如果是这样,为什么下面的代码会死锁?
#include <iostream>
#include <semaphore.h>
#include <sys/wait.h>
using namespace std;
static int MAX = 100;
int main(int argc, char* argv[]) {
int retval;
sem_t mutex;
cout << sem_init(&mutex, 1, 0) << endl;
pid_t pid = fork();
if (0 == pid) {
// sem_wait(&mutex);
cout << endl;
for (int i = 0; i < MAX; i++) {
cout << i << ",";
}
cout << endl;
sem_post(&mutex);
} else if(pid > 0) {
sem_wait(&mutex);
cout << endl;
for (int i = 0; i < MAX; i++) {
cout << i << ",";
}
cout << endl;
// sem_post(&mutex);
wait(&retval);
} else {
cerr << "fork error" << endl;
return 1;
}
// sem_destroy(&mutex);
return 0;
}
当我在 Gentoo/Ubuntu Linux 上运行它时,父进程挂起。显然,它没有收到孩子的帖子。取消注释 sem_destroy 不会有任何好处。我错过了什么吗?
更新1:这段代码有效
mutex = (sem_t *) mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, 0, 0);
if (!mutex) {
perror("out of memory\n");
exit(1);
}
谢谢,
尼勒什。
中的措辞手册页有点暧昧。
如果 pshared 非零,则信号量在进程之间共享,
和应该位于共享内存区域.
由于 fork(2) 创建的子进程继承其父进程的内存
映射,它还可以访问信号量。
对,但是它仍然必须位于共享区域。否则,内存就会被通常的复制CoW就是这样。
您至少可以通过两种方式解决这个问题:
- Use
sem_open("my_sem", ...)
- Use
shm_open
and mmap
创建共享区域
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)