procs,fork()和mutexes

我想创建并行运行的n个进程,让它们锁定互斥锁,递增计数器,然后解锁并退出。

这是我的代码:

#include  #include  #include  #include  #include  #include  #include  pthread_mutex_t mutex; int main(int argc, char **argv) { if (argc != 2) return 0; int n = atoi(argv[1]); int i = 0; int status = 0; pthread_mutex_init(&mutex, NULL); pid_t pid = 1; static int *x; x = mmap(NULL, sizeof *x, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); *x = 0; printf("Creating %d children\n", n); for(i = 0; i < n; i++) { if (pid != 0) pid = fork(); } if (pid == 0) { pthread_mutex_lock(&mutex); *x = *x + 1; printf("[CHLD] PID: %d PPID: %d X: %d\n", getpid(), getppid(), *x); pthread_mutex_unlock(&mutex); exit(0); } wait(&status); printf("[PRNT] PID: %d X: %d\n", getpid(), *x); munmap(x, sizeof *x); return 0; } 

./procs 10000然而不返回x = 10000我认为这是因为互斥进程之间没有共享互斥锁,但共享互斥锁的正确方法是什么?

这是使用pthread_mutex的注释中我的示例的一个端口。 我第一次这样做,但似乎工作:

 #include  #include  #include  #include  #include  #include  #include  typedef struct { bool done; pthread_mutex_t mutex; } shared_data; static shared_data* data = NULL; void initialise_shared() { // place our shared data in shared memory int prot = PROT_READ | PROT_WRITE; int flags = MAP_SHARED | MAP_ANONYMOUS; data = mmap(NULL, sizeof(shared_data), prot, flags, -1, 0); assert(data); data->done = false; // initialise mutex so it works properly in shared memory pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); pthread_mutex_init(&data->mutex, &attr); } void run_child() { while (true) { puts("child waiting. .. "); usleep(500000); pthread_mutex_lock(&data->mutex); if (data->done) { pthread_mutex_unlock(&data->mutex); puts("got done!"); break; } pthread_mutex_unlock(&data->mutex); } puts("child exiting .."); } void run_parent(pid_t pid) { puts("parent sleeping .."); sleep(2); puts("setting done .."); pthread_mutex_lock(&data->mutex); data->done = true; pthread_mutex_unlock(&data->mutex); waitpid(pid, NULL, NULL); puts("parent exiting .."); } int main(int argc, char** argv) { initialise_shared(); pid_t pid = fork(); if (!pid) { run_child(); } else { run_parent(pid); } munmap(data, sizeof(data)); return 0; }