多个线程试图锁定

Posted

技术标签:

【中文标题】多个线程试图锁定【英文标题】:Multiple threads attempting to lock 【发布时间】:2013-06-13 20:31:30 【问题描述】:

我想在 C++ 程序中使用 pthreads 和 pthread_mutexes。我还没有任何实际代码,只是一个关于互斥锁如何工作的问题。如果我让线程 1 锁定了一个互斥体,然后 n 个其他线程尝试锁定同一个互斥体,那么当线程 1 解锁互斥体时会发生什么行为?如果线程 1 获得了锁,那么线程 2 尝试加锁,然后线程 3 尝试加锁,释放锁时线程 2 的优先级是否高于线程 3?

这是一个更有条理的锁定时间表:

thread 1 acquires lock
thread 2 attempts to lock
thread 3 attempts to lock
thread 4 attempts to lock
thread 1 unlocks mutex
??

换句话说,我希望线程按照它们尝试获取锁/创建的顺序执行。如果有更好的方法可以做到这一点,我非常愿意接受建议。

【问题讨论】:

【参考方案1】:

不 - 不会有这样的保证订购。线程 1 释放后,互斥体线程 3 可以获取或线程 2 可以获取它。你无法预测。

阅读this 以获得解释。

【讨论】:

【参考方案2】:

我想我会发布我的解决方案,以便其他人可以看到潜在的解决方法:

我的主线程是通过锁定创建互斥体并将每个线程放入std::queue 来创建工作线程的线程。

在 main 开始时,我创建了一个管理器线程,它处于无限循环中,每个循环都会检查队列是否为空。当管理线程看到队列非空时 (if(! queue::empty())),它等待获取锁,然后创建前端线程,将其从队列中弹出,在线程上执行 pthread_join() 并循环返回下一个线程。

【讨论】:

以上是关于多个线程试图锁定的主要内容,如果未能解决你的问题,请参考以下文章

同时重启多个锁定线程

锁定多个线程

.NET 锁定还是 ConcurrentDictionary?

如果我需要在锁定互斥锁后解锁它,我该如何返回一个值?

shared_ptr.get() 是不是可以被多个线程调用,而另一个线程锁定并调用 shared_ptr.swap()?

无锁定的多个矢量编写器