使用信号量进行for循环的进程之间的同步

时间:2016-09-28 08:41:52

标签: c multithreading semaphore

上下文:

  • 我正在尝试将两个进程写入共享内存空间中的同一个数组。

  • 每个进程都会使用for循环写入数组的一半。

  • 数组的第一个元素将始终存储要写入的下一个元素的索引。

  • IPC通过共享内存中的信号量完成。

前提条件:

  1. 阵列和信号量都在共享内存中正确设置。
  2. 如果我在for循环之外等待sem_wait和sem_post,程序工作正常,这意味着使整个过程成为原子。 (这也是我相信信号量和数组已正确设置的原因)
  3. 问题

    但是,当我尝试通过将sem_wait和sem_post放入for循环来减少关键区域时。它不同步,因为有一部分数组没有写入。但是这两个进程完成了它们的循环,其中总循环计数应该等于数组长度。

    非常感谢为什么会发生这种情况?

    更新

    在OS X上,sem_init()未按预期工作。使用sem_open()来解决问题。 参考:http://lists.apple.com/archives/darwin-dev//2008/Oct/msg00044.html

2 个答案:

答案 0 :(得分:0)

在问题情况的伪代码中,父线程一旦自己释放就需要信号量。现在,信号量可用,父进程将继续执行。当其时间片到期时,内核可能会切换到子进程,但它正在等待信号量。信号量由父进程获取。所以父母将继续执行。

在这种情况下,父执行了两次而子进程没有执行。

这可能导致执行不同步。

答案 1 :(得分:0)

查看您的实际代码我认为问题在于您如何创建信号量。如果您阅读sem_init上的手册页:

  

如果pshared非零,那么信号量之间是共享的    进程,并且应位于共享内存区域(请参阅    shm_open(3),mmap(2)和shmget(2))。 (自从孩子创建以来    fork(2)继承其父级的内存映射,它也可以访问    信号量。)任何可以访问共享内存区域的进程都可以    使用sem_post(3),sem_wait(3)等操作信号量。

这里的关键是以粗体显示的文本 - 您的信号量不在共享内存中,因此在两个进程之间并不真正共享,因此您会看到争用。