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

时间:2012-01-28 16:17:31

标签: c++ multithreading mutex

我目前正在尝试使用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会将其解锁并再次锁定它,我确定锁定将被赋予{{1}首先?如果没有,有没有办法确保它?

1 个答案:

答案 0 :(得分:9)

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

有关此主题的更多信息,请访问http://en.wikipedia.org/wiki/Condition_variable。如果您使用的是pthread库,那么等效调用将在您的“线程循环”中为pthread_cond_wait,在runTask函数中为pthread_cond_signal