假设我们为信号量定义了Up()
,Down()
和Peek()
操作,Peek()
操作返回信号量的值。
Peek()
操作的优点和缺点是什么?
如何有效使用Peek()
操作?
答案 0 :(得分:2)
peek
函数对同步没用。它只允许查看当前状态,但不应采取任何操作,因为在查看之后,信号量可以已经被更改。它可以用于监视以解决死锁,但这非常棘手。正如评论中所提到的,它可以帮助调试。
try
函数更有用。如果可能的话,那只会down
信号量,如果不可能则返回失败的条件。这样,如果信号量是空闲的,则可以执行操作,如果信号量不是,则不会阻塞(基于轮询)。大多数情况下,使用仅up
和down
的不同线程可以获得更好的结果(至少更清晰的代码)
答案 1 :(得分:1)
[假设问题是关于操作系统的本机信号量。]
在WinAPI和Linux中,信号量是内核对象,因此可以从另一个进程甚至另一个应用程序访问信号量。纯信号量are not just mutexes with an attached counter。你不能只是向上和向下信号量,没有Capture()
函数来手动递减计数器。但是,您可以使用Wait()
和Release()
函数代替此操作。当wait函数返回时,它会将信号量的计数减一。当线程或进程使用完资源时,它会调用Release()
将信号量的计数增加一。
Peek()
是什么,它对于同步目的没用。但是您可以在调试时检查信号量是否可用。请尽量避免使用Peek()
进行同步,尝试仅处理Wait()
和Release()
。