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一个?如果没有,有没有办法确保它?
不,您无法保证您的线程循环将按原样获取锁定.使用条件变量向线程循环发出信号,告知它应该唤醒并获取锁定.见std::condition_variable::wait(...).
条件可变
有关此主题的更多信息,请访问http://en.wikipedia.org/wiki/Condition_variable.如果您使用的是pthread库,则等效调用将pthread_cond_wait位于"线程循环"和pthread_cond_signalrunTask函数中.