答案 0 :(得分:3)
这是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信号量也是如此。如果你足够聪明只在适当的时候使用它,那么这是一个很有用的工具。
答案 1 :(得分:0)
定时互斥等待的最佳用例是在仅在特定时间内有效的操作中,因此在资源拥塞时它们应该失败。