我目前正在尝试使用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
会将其解锁并再次锁定它,我确定锁定将被赋予{{1}首先?如果没有,有没有办法确保它?
答案 0 :(得分:9)
不,您不能保证您的线程循环将按原样获取锁定。使用条件变量向线程循环发出信号,告知它应该唤醒并获取锁定。见std::condition_variable::wait(...)
。
condition-variable
有关此主题的更多信息,请访问http://en.wikipedia.org/wiki/Condition_variable。如果您使用的是pthread库,那么等效调用将在您的“线程循环”中为pthread_cond_wait
,在runTask函数中为pthread_cond_signal
。