【问题标题】:Peek operation for semaphore信号量的 Peek 操作
【发布时间】:2013-12-04 02:45:42
【问题描述】:

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

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

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

【问题讨论】:

  • 主要用于调试和测试。你不能用它做很多有用的同步。

标签: c++ c operating-system semaphore


【解决方案1】:

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

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

Peek() 怎么样,是的,它对同步目的没有用。但是您可以在调试时检查信号量的可用性。请尽量避免使用Peek() 进行同步,尽量只处理Wait()Release()

【讨论】:

    【解决方案2】:

    peek 函数对同步无用。它只允许查看当前状态,但不应该采取任何行动,因为在窥视之后,信号量已经可以改变。它可以用于监视以解决死锁,但这非常棘手。在 cmets 中提到,它可以帮助调试。

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

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      相关资源
      最近更新 更多