2

在哪些情况下std::timed_mutex比常规互斥锁更受欢迎?

我能想到的唯一用例是防止死锁的(IMO hackish)方法。

在哪些其他情况下std::timed_mutex是一个不错的选择?

4

2 回答 2

3

这是 Windows 上的常见设计实践,您可以使用其中一个WaitForSingleObjectWaitForMultipleObjects与超时值一起使用,指定等待应该失败的时间。

它不用于解决死锁(这真的无济于事,糟糕的线程代码就是糟糕的线程代码)。

请记住,在 Windows Vista 发布之前,Windows 没有等效的 Posix 条件变量,这是一种完全不同的多线程编码范式,它起到了一定的作用,但不是存在定时互斥锁的唯一原因。

您不会在基本示例中看到定时等待的使用,但在复杂的架构中,您会经常遇到它。您使用互斥锁的一个示例通常是某种生产者-消费者架构,其中客户端必须每 x 秒执行一次操作,并有可能以触发事件的形式出现“中断”。一个简单的伪代码示例:

//This code will run indefinitely, printing the value of 
//the variable x every 1 second until an interrupt is received
while(timed_wait(end_mutex, 1 second) != success)
    print(x)

是的,这段代码可以重写如下:

while(true){
   sleep(1 second)
   wait(mutex)
   done = globalDone
   unlock(mutex)

   if(done) break
   else print(x)
}

但是前面的示例更简洁,响应更快,因为它不是睡眠(即,只要互斥锁可用,它就会停止)。

请注意,Linux 具有不属于 Posix 标准的附加功能来对互斥体进行定时等待(pthread_mutex_timedlock但我认为它现在在 posix 规范中)。OS X 和 BSD 上的 sysv 信号量也是如此。这是一个有用的工具,如果你足够聪明,只在适当的时候使用它。

于 2012-04-21T05:28:20.427 回答
0

定时互斥等待的最佳用例是仅在特定时间内有效的操作,因此在资源拥塞的情况下它们应该会失败。

于 2012-04-21T13:52:37.560 回答