【问题标题】:How to revoke SEM_UNDO of latest operation on semaphore?如何撤销信号量最新操作的SEM_UNDO?
【发布时间】:2014-01-11 01:34:06
【问题描述】:

我的问题: A,B - 信号量。

流程是循环:

  1. 等待 A >= 1,递减 A
  2. 做一些计算
  3. 增量 B.
  4. 回到 1。

目标:进程终止后,我需要 A 的减量等于 B 的增量。

所以我想我会在 1 中添加标志 SEM_UNDO。但它会撤消该过程对 A 所做的每个 DEcrement。当进程达到 4. 时,如何从 1. 撤销/撤消 SEM_UNDO?

【问题讨论】:

  • 如果AB 最后不匹配,你的问题比SEM_UNDO 更大。似乎您有点误解信号量在事物中的作用。你给我们看一些代码怎么样,我们可以帮你弄清楚如何避免这些扭曲。

标签: linux ipc semaphore


【解决方案1】:

好的,当我将问题视为“撤消” SEM_UNDO 而不是“撤销”它时,我受到了启发。

在使用 SEM_UNDO 操作 +x 调用 semop() 之后,您可以稍后通过两个操作再次调用 semop() 来撤消该 SEM_UNDO:

  1. -x 带 SEM_UNDO
  2. +x 没有 SEM_UNDO

【讨论】:

  • 我承认我无法理解你在做什么,但我猜你已经把自己画在一个角落里,现在认为在墙上挖一个洞从另一个房间逃出去是一个解决方案.
  • @Duck 在我描述我试图做的事情的部分问题中有一个错误 - 只是纠正了它。对不起大家。
  • 这是不正确的。确保您的进程在终止时没有未完成的撤消的方法是同时执行 + 和 - 操作 with SEM_UNDO。
  • docs.oracle.com/cd/E19120-01/open.solaris/817-4415/svipc-65382:“当执行一个SEM_UNDO有效的信号量操作时,你还必须有SEM_UNDO有效的调用执行逆向操作。当进程正常运行时,逆向操作更新具有互补值的撤消结构。这确保了,除非进程被中止,否则应用于撤消结构的值被取消为零。当撤消结构达到零时,它被删除。"
  • @craig65535 对,我修好了,请检查。谢谢。
猜你喜欢
  • 2015-03-19
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多