我目前正在尝试使用创建一个非常简单的线程池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
, the ThreadPool
搜索线程对象m_bAvailable
set to true
。它解锁相应的互斥体,因此thread
可以锁定它并执行它的任务。这thread
立即解锁,以便ThreadPool
可以再次锁定它,这样thread
一旦其任务完成就停止。
但问题是,锁会按照线程询问的顺序进行吗?换句话说,如果一个thread
锁定 amutex
,那么ThreadPool
解锁并再次锁定,我确定锁定将被授予thread
第一的?如果不能,有办法保证吗?
不,您不能保证您的线程循环将按原样获取示例的锁。使用条件变量向线程循环发出信号,指示它应该唤醒并获取锁。看std::condition_variable::wait(...)
.
条件变量
有关此主题的更多一般信息可以在此处找到http://en.wikipedia.org/wiki/Condition_variable。如果您使用 pthread 库,则等效的调用将是pthread_cond_wait
在你的“线程循环”和pthread_cond_signal
在你的 runTask 函数中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)