互斥锁是否按照询问的顺序发生

Do mutex locks happen in the same order they are asked?

本文关键字:顺序发生 是否      更新时间:2023-10-16

我目前正在尝试使用 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();
}

为了查找iThreadPool搜索一个m_bAvailable设置为 true 的线程对象。它解锁相应的互斥锁,以便thread可以锁定它并执行其任务。thread会立即解锁它,以便ThreadPool可以再次锁定它,以便在thread完成任务后停止。

但问题是,锁会按照线程询问的顺序进行吗?换句话说,如果一个threadmutex进行锁定,那么ThreadPool会解锁它并再次锁定它,我确定锁会先给thread吗?如果没有,有没有办法确保它?

不,您不能保证您的线程循环将按原样获取您的示例的锁。 使用条件变量向线程循环发出信号,表明它应该唤醒并获取锁。 请参阅std::condition_variable::wait(...) 。条件变量

有关此主题的更多信息,请参阅此处 http://en.wikipedia.org/wiki/Condition_variable。如果您使用的是 pthread 库,则等效调用将在"线程循环"中pthread_cond_wait,并在 runTask 函数中pthread_cond_signal