繁体   English   中英

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

[英]Valid use cases for `std::timed_mutex`?

在哪种情况下, std :: timed_mutex比普通的互斥锁更受欢迎?

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

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

这是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信号量也是如此。 如果你足够聪明只在适当时使用它,它是一个有用的工具。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM