私の理解によれば、セマフォは、関連するプロセス間で共有メモリに置かれていなくても使用可能でなければなりません。もしそうなら、なぜ次のコードはデッドロックですか?posixプロセス間セマフォの理解
#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);
}
おかげで、 Nileshに動作します。
使用している言語のタグを追加できますか?私はcまたはC++を推測しますが、それは検索可能性を助けます。 – NickHeidke