在哪些情况下std::timed_mutex比常规互斥锁更受欢迎?
我能想到的唯一用例是防止死锁的(IMO hackish)方法。
在哪些其他情况下std::timed_mutex
是一个不错的选择?
这是 Windows 上的常见设计实践,您可以使用其中一个WaitForSingleObject
或WaitForMultipleObjects
与超时值一起使用,指定等待应该失败的时间。
它不用于解决死锁(这真的无济于事,糟糕的线程代码就是糟糕的线程代码)。
请记住,在 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 信号量也是如此。这是一个有用的工具,如果你足够聪明,只在适当的时候使用它。
定时互斥等待的最佳用例是仅在特定时间内有效的操作,因此在资源拥塞的情况下它们应该会失败。