假设我们为信号量定义了Up()、Down()和Peek()操作,而Peek()操作返回信号量的值。
Peek()操作的利弊是什么?
如何有效地使用Peek()操作?
发布于 2013-11-20 08:45:07
peek函数对于同步是无用的。它只允许查看当前状态,但不应该采取任何操作,因为在查看之后,信号量已经可以更改。它可以用于监视以解决死锁,但这是非常棘手的。正如注释中提到的,它可以帮助调试。
try函数更有用。这只会在可能的情况下down信号量,如果不可能返回一个失败的条件。这样,如果信号量是空闲的,就可以执行操作,如果不是,则不要阻塞(基于轮询)。大多数情况下,使用不同的线程只使用up和down可以获得更好的结果(至少更干净的代码)。
发布于 2013-11-20 09:06:27
据推测,这个问题是关于操作系统的本地信号量。
在WinAPI和Linux中,信号量是内核对象,因此可以从另一个进程甚至从另一个应用程序访问信号量。纯信号量不仅仅是带有附加计数器的互斥.您不能只up和down (信号量),也没有Capture()函数来手动减少计数器。但是没有这样做,而是使用了Wait()和Release()函数。当等待函数返回时,它会将信号量的计数减少1。当线程或进程使用完资源后,它调用Release()将信号量的计数增加一个。
那么Peek()呢--是的,它对于同步的目的是无用的。但是,您可以在调试时检查信号量的可用性。请尽量避免使用Peek()进行同步,尝试只处理Wait()和Release()。
https://stackoverflow.com/questions/20090340
复制相似问题