`std :: timed_mutex`的有效用例?

时间:2012-04-21 05:08:01

标签: c++ concurrency

在哪种情况下std::timed_mutex优于常规互斥锁?

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

在其他情况下,std::timed_mutex会是一个不错的选择吗?

2 个答案:

答案 0 :(得分: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信号量也是如此。如果你足够聪明只在适当的时候使用它,那么这是一个很有用的工具。

答案 1 :(得分:0)

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