一位同事最近遇到了一个问题,归结为我们认为具有两个线程的 C++ 应用程序中的以下事件序列:
线程 A 持有一个互斥锁。
当线程 A 持有互斥体时,线程 B 尝试锁定它。由于它被持有,线程 B 被挂起。
线程 A 完成了它持有互斥锁的工作,从而释放了互斥锁。
此后不久,线程 A 需要访问受互斥锁保护的资源,因此它再次锁定它。
似乎线程 A 再次获得了互斥锁;线程 B 仍在等待,即使它首先“请求”锁定。
这一系列事件是否符合 C++11std::mutex
和/或 pthread 的语义?老实说,我以前从未考虑过互斥锁的这一方面。
是否有任何公平保证可以防止其他线程饥饿太久,或者有什么方法可以得到这样的保证?