我正在尝试将两个进程写入共享内存空间中的同一个数组。
每个进程都会使用for循环写入数组的一半。
数组的第一个元素将始终存储要写入的下一个元素的索引。
IPC通过共享内存中的信号量完成。
但是,当我尝试通过将sem_wait和sem_post放入for循环来减少关键区域时。它不同步,因为有一部分数组没有写入。但是这两个进程完成了它们的循环,其中总循环计数应该等于数组长度。
非常感谢为什么会发生这种情况?
更新
在OS X上,sem_init()未按预期工作。使用sem_open()来解决问题。 参考:http://lists.apple.com/archives/darwin-dev//2008/Oct/msg00044.html
答案 0 :(得分:0)
在问题情况的伪代码中,父线程一旦自己释放就需要信号量。现在,信号量可用,父进程将继续执行。当其时间片到期时,内核可能会切换到子进程,但它正在等待信号量。信号量由父进程获取。所以父母将继续执行。
在这种情况下,父执行了两次而子进程没有执行。
这可能导致执行不同步。
答案 1 :(得分:0)
查看您的实际代码我认为问题在于您如何创建信号量。如果您阅读sem_init上的手册页:
如果pshared非零,那么信号量之间是共享的 进程,并且应位于共享内存区域(请参阅 shm_open(3),mmap(2)和shmget(2))。 (自从孩子创建以来 fork(2)继承其父级的内存映射,它也可以访问 信号量。)任何可以访问共享内存区域的进程都可以 使用sem_post(3),sem_wait(3)等操作信号量。
这里的关键是以粗体显示的文本 - 您的信号量不在共享内存中,因此在两个进程之间并不真正共享,因此您会看到争用。