【发布时间】:2013-12-04 02:45:42
【问题描述】:
假设我们为信号量定义了Up()、Down()和Peek()操作,Peek()操作返回信号量的值。
Peek()操作的优缺点是什么?
如何有效地使用Peek()操作?
【问题讨论】:
-
主要用于调试和测试。你不能用它做很多有用的同步。
标签: c++ c operating-system semaphore
假设我们为信号量定义了Up()、Down()和Peek()操作,Peek()操作返回信号量的值。
Peek()操作的优缺点是什么?
如何有效地使用Peek()操作?
【问题讨论】:
标签: c++ c operating-system semaphore
[假设问题是关于操作系统的本机信号量。]
在 WinAPI 和 Linux 中,信号量是内核对象,因此可以从另一个进程甚至从另一个应用程序访问信号量。纯信号量are not just mutexes with an attached counter。您不能只up 和 down 信号量,没有Capture() 函数可以手动递减计数器。但不是这样做,你有Wait() 和Release() 函数。当等待函数返回时,它会将信号量的计数减一。当线程或进程使用完资源后,它会调用Release() 将信号量的计数加一。
Peek() 怎么样,是的,它对同步目的没有用。但是您可以在调试时检查信号量的可用性。请尽量避免使用Peek() 进行同步,尽量只处理Wait() 和Release()。
【讨论】:
peek 函数对同步无用。它只允许查看当前状态,但不应该采取任何行动,因为在窥视之后,信号量已经可以改变。它可以用于监视以解决死锁,但这非常棘手。在 cmets 中提到,它可以帮助调试。
try 函数更有用。如果可能,那只会down 信号量,如果不可能,则返回失败的条件。这种方式可以在信号量空闲时执行操作,如果不是(基于轮询)则不阻塞。大多数情况下,仅使用 up 和 down 使用不同的线程会产生更好的结果(至少代码更简洁)
【讨论】: