C++ “std::timed_mutex”的有效用例?

C++ “std::timed_mutex”的有效用例?,c++,concurrency,C++,Concurrency,在哪些情况下,与常规互斥锁相比,互斥锁更受欢迎 我能想到的唯一用例是防止死锁的一种(IMO黑客)方法 在其他什么情况下,std::timed_mutex是一个好的选择?这是Windows上的一种常见设计实践,您可以使用带有超时值的WaitForSingleObject或WaitForMultipleObjects,指定等待失败的时间 它不用于解决死锁(这真的没有帮助,线程化差的代码就是线程化差的代码) 请记住,在Windows Vista发布之前,Windows没有Posix条件变量的等价物,这

在哪些情况下,与常规互斥锁相比,互斥锁更受欢迎

我能想到的唯一用例是防止死锁的一种(IMO黑客)方法


在其他什么情况下,
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\u mutex\u timedlock
,但我认为它现在在Posix规范中)。OSX和BSD上的sysv信号量也是如此。如果您足够聪明,只在适当的时候才使用它,那么它是一个非常有用的工具。

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