在我看来,所有的块操作都应该提供一些机制来中断等待并让线程干净地返回,就像Windows API中的alertable wait操作一样。但是,除了Windows API之外,很难看到这样的功能。我不知道为什么。
想象一下如果块操作不提供这样的机制会发生什么。 Boost.Interprocess中的message_queue
类就是这样一个例子。其send()
和receive()
方法正在阻止。这意味着具有阻塞线程的进程将无法完全控制自身。除非有一些外部因素发挥作用,否则这样的过程甚至无法选择彻底退出,因为实际上没有办法强制阻塞的线程退出其等待状态。除此之外,没有这样的功能,没有干净的方法来解决已经发生并已被检测到的死锁。尽管有这些,我已经看到很多阻塞操作设计没有这样的功能。为什么是这样?我刚搞错了吗?
另一个例子是C ++ 11中的std::mutex::lock()
。但由于它是整个流程的,并且外部因素仍然在流程的控制范围内,因此问题并不像机器范围的阻塞机制那么严重。但是提供一个退出方法不是更好吗?我知道std::condition_variable
。我只是认为每个阻塞操作都应该是可以中断的,即使代价是性能下降。