偷看信号量的操作

时间:2013-11-20 07:58:30

标签: c++ c operating-system semaphore

假设我们为信号量定义了Up()Down()Peek()操作,Peek()操作返回信号量的值。

Peek()操作的优点和缺点是什么?

如何有效使用Peek()操作?

2 个答案:

答案 0 :(得分:2)

peek函数对同步没用。它只允许查看当前状态,但不应采取任何操作,因为在查看之后,信号量可以已经被更改。它可以用于监视以解决死锁,但这非常棘手。正如评论中所提到的,它可以帮助调试。

try函数更有用。如果可能的话,那只会down信号量,如果不可能则返回失败的条件。这样,如果信号量是空闲的,则可以执行操作,如果信号量不是,则不会阻塞(基于轮询)。大多数情况下,使用仅updown的不同线程可以获得更好的结果(至少更清晰的代码)

答案 1 :(得分:1)

  

[假设问题是关于操作系统的本机信号量。]

在WinAPI和Linux中,信号量是内核对象,因此可以从另一个进程甚至另一个应用程序访问信号量。纯信号量are not just mutexes with an attached counter。你不能只是向上向下信号量,没有Capture()函数来手动递减计数器。但是,您可以使用Wait()Release()函数代替此操作。当wait函数返回时,它会将信号量的计数减一。当线程或进程使用完资源时,它会调用Release()将信号量的计数增加一。

Peek()是什么,它对于同步目的没用。但是您可以在调试时检查信号量是否可用。请尽量避免使用Peek()进行同步,尝试仅处理Wait()Release()