互斥体是否保证获取的顺序?解锁线程在其他线程仍在等待时再次获取它

2024-01-12

一位同事最近遇到了一个问题,我们认为该问题归结为具有两个线程的 C++ 应用程序中的以下事件序列:

  • 线程 A 持有一个互斥锁。

  • 当线程 A 持有互斥锁时,线程 B 尝试锁定它。由于它被持有,线程 B 被挂起。

  • 线程 A 完成了它持有互斥锁的工作,从而释放了互斥锁。

  • 此后不久,线程 A 需要接触受互斥锁保护的资源,因此它再次锁定它。

  • 看来线程 A 再次获得了互斥锁;线程 B 仍在等待,尽管它首先“请求”锁。

这个事件序列是否符合 C++11 等语言的语义std::mutex和/或 pthreads?我可以诚实地说我以前从未考虑过互斥体的这个方面。

是否有任何公平保证来防止其他线程长时间饥饿,或者有什么方法可以获得这样的保证?


已知问题。 C++ 互斥体是操作系统提供的互斥体之上的薄层,而操作系统提供的互斥体通常是不公平的。他们不关心先进先出。

同一枚硬币的另一面是,线程通常不会被抢占,直到它们用完其时间片。因此,这种情况下的线程 A 很可能会继续执行,并因此立即获得互斥锁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互斥体是否保证获取的顺序?解锁线程在其他线程仍在等待时再次获取它 的相关文章

随机推荐