【发布时间】:2011-05-16 13:31:40
【问题描述】:
我正在处理一个 uni 分配,并且遇到了我的代码的问题,该代码应该产生 2 个进程,其中第二个进程在执行之前等待第一个进程完成。这是我目前所拥有的:
sem_t mutex;
int producer; int consumer;
sem_init(&mutex, 0, 1);
producer = fork();
consumer = fork();
if (producer == 0) {
if (VERBOSE) printf("Running producer\n");
/* down semaphore */
sem_wait(&mutex);
/* START CRITICAL REGION */
get_files(N);
/* END CRITICAL REGION */
/* up semaphore */
sem_post(&mutex);
if (VERBOSE) printf("Ending producer\n");
exit(0);
}
if (consumer == 0) {
if (VERBOSE) printf("Running consumer\n");
/* down semaphore */
sem_wait(&mutex);
/* START CRITICAL REGION */
/* do stuff */
/* END CRITICAL REGION */
/* up semaphore */
sem_post(&mutex);
if (VERBOSE) printf("Ending consumer\n");
exit(0);
}
/* parent waits for both to complete */
wait(NULL);
现在,我知道在“现实世界”中这真的很愚蠢。如果我的“消费者”在我的“生产者”完成之前什么都不做,那么你可能没有像这样的 2 个进程,但任务是试图说明一个竞争条件,所以为什么我们被特别告知要这样做。
所以,我的问题是消费者进程没有等待生产者。我假设由于信号量在生产者 (sem_wait(&mutex);) 中被删除,那么在生产者中调用 sem_post(&mutex); 之前,消费者将无法使用它。
此外,据我所知,wait(NULL); 行并未等待这两个进程完成。
我是否严重误解了什么?
【问题讨论】:
-
你创建进程而不是线程。
-
fork 共享内存......它应该可以看到并能够使用互斥锁,不是吗? (我可能在这里过得很好,我没试过)
-
@tobyodavies:我这么说是因为“应该产生 2 个线程”这个短语
-
@tobyodavies:不,
fork()创建的进程不共享内存(除非内存已专门映射为MAP_SHARED)。 -
@tobyodavies:你确定 fork 共享内存吗?我认为它会重复从父母到孩子的记忆......
标签: c multithreading unix semaphore