互斥锁是否按照它们被询问的顺序发生?

Juk*_*rpa 5 c++ multithreading mutex

我目前正在尝试使用创建一个非常简单的线程池std::thread.为了在完成给定任务后保持线程"活着",我将a 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();
}
Run Code Online (Sandbox Code Playgroud)

为了找到i时,ThreadPool与一个线程对象的搜索m_bAvailable设置为true.它解锁相应的互斥锁,以便thread锁定它并执行其任务.该thread立即将其解锁,因此ThreadPool能够使再次锁定它thread,一旦它的任务完成停止.

但问题是,是否按照线程要求的顺序进行锁定?换句话说,如果一个thread锁定a mutex,然后ThreadPool解锁它并再次锁定它,我确定锁将被赋予第thread一个?如果没有,有没有办法确保它?

Wil*_*ley 9

不,您无法保证您的线程循环将按原样获取锁定.使用条件变量向线程循环发出信号,告知它应该唤醒并获取锁定.见std::condition_variable::wait(...).

有关此主题的更多信息,请访问http://en.wikipedia.org/wiki/Condition_variable.如果您使用的是pthread库,则等效调用将pthread_cond_wait位于"线程循环"和pthread_cond_signalrunTask函数中.