互斥锁是否按照询问的顺序发生
Do mutex locks happen in the same order they are asked?
我目前正在尝试使用 std::thread
创建一个非常简单的线程池。为了在给定任务完成后保持线程"活动",我将一个std::mutex
与每个线程相关联。
原理有点像这样:
// Thread loop
while (1)
{
m_oMutex->lock();
m_oMutex->unlock();
m_bAvailable = false;
m_oTask();
m_bAvailable = true;
}
// ThreadPool function which gives a task to a thread
void runTask(boost::function<void ()> oTask)
{
[...]
m_oThreads[i]->setTask(oTask);
m_oMutexes[i]->unlock(); // same mutex as thread's m_oMutex
m_oMutexes[i]->lock();
}
为了查找i
,ThreadPool
搜索一个m_bAvailable
设置为 true
的线程对象。它解锁相应的互斥锁,以便thread
可以锁定它并执行其任务。thread
会立即解锁它,以便ThreadPool
可以再次锁定它,以便在thread
完成任务后停止。
但问题是,锁会按照线程询问的顺序进行吗?换句话说,如果一个thread
对mutex
进行锁定,那么ThreadPool
会解锁它并再次锁定它,我确定锁会先给thread
吗?如果没有,有没有办法确保它?
不,您不能保证您的线程循环将按原样获取您的示例的锁。 使用条件变量向线程循环发出信号,表明它应该唤醒并获取锁。 请参阅std::condition_variable::wait(...)
。条件变量
有关此主题的更多信息,请参阅此处 http://en.wikipedia.org/wiki/Condition_variable。如果您使用的是 pthread 库,则等效调用将在"线程循环"中pthread_cond_wait
,并在 runTask 函数中pthread_cond_signal
。
相关文章:
- 检查 2 棵树是否具有相同的顺序
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- C++编译器是否优化了顺序静态变量读取?
- 同一互斥锁顺序上的锁定和解锁是否一致?
- 在 c++ 中,发生故障后是否需要 stream.clear()?
- C++评估顺序优化是否意味着对不同的操作数使用不同的内核?
- 标记为 std::memory_order_seq_cst 的单个原子操作是否会在所有位置触发顺序一致性?
- 如何检查参数包是否具有执行顺序中的确切类型
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 这种情况以什么顺序发生
- 当变量的顺序发生变化时C++双倍乘法会产生不同的结果
- 修改顺序是否有助于发生在关系之前
- 加速变体:绑定顺序中是否有魔力
- printf函数参数之间的序列点;转换之间的顺序点是否重要
- 为什么我的原子操作以意外的顺序发生
- 互斥锁是否按照询问的顺序发生
- 松弛的内存顺序效果是否可以扩展到执行线程的生命周期之后?
- 在将参数传递给类的构造函数的顺序中是否有任何协议或同意?