【发布时间】:2017-02-06 02:56:16
【问题描述】:
上下文:
-
我试图让两个进程写入共享内存空间中的同一个数组。
-
每个进程都会用 for 循环写入数组的一半。
-
数组的第一个元素将始终存储要写入的下一个元素的索引。
-
IPC 是通过共享内存中的信号量完成的。
前提条件:
- 数组和信号量都在共享内存中正确设置。
- 如果我在 for 循环之外等待 sem_wait 和 sem_post,程序可以正常工作,这意味着使整个过程原子化。 (这也是我认为信号量和数组设置正确的原因)
问题
但是,当我尝试通过将 sem_wait 和 sem_post 放入 for 循环来减少临界区域时。它不是同步的,因为有一部分数组没有被写入。但是这两个进程完成了它们的循环,总循环数应该等于数组长度。
非常感谢建议为什么会发生这种情况???
更新
在 OS X 上,sem_init() 没有按预期工作。使用 sem_open() 来解决问题。 参考:http://lists.apple.com/archives/darwin-dev//2008/Oct/msg00044.html
【问题讨论】:
-
我不清楚您遇到了什么问题 - 它不同步 - 信息量不大。此外,您确实应该提供一个最低限度的工作代码示例,在大多数情况下,试图从伪代码中找出问题是不可能的。此外,创建重现问题的工作代码通常是自己实际解决问题的最快方法!
-
@Jackson 感谢您的反馈。事实上,我会说工作代码 sn-ps 与伪代码有 90% 的相似性。如果不包括所有设置,就不可能有一些工作代码。这就是为什么我不只是复制粘贴我的代码。详细阐述了这个问题。
-
如果没有工作代码示例,我们无法查看您是否正确处理错误、正确创建信号量或执行其他导致问题的操作。你不太可能得到一个明智的答案,你的问题最终会结束。如果您还没有这样做,请阅读有关提问和创建最小工作示例的帮助部分。
-
伪代码的问题是它只显示了预期的处理,这里似乎是正确的。所以问题应该隐藏在未显示的细节中,比如
arrayvolatile,或者信号量是如何初始化的?
标签: c multithreading semaphore