【发布时间】:2012-01-28 16:17:30
【问题描述】:
我目前正在尝试使用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 将其解锁并再次锁定它,我确定锁定将首先给予thread 吗?如果没有,有办法保证吗?
【问题讨论】:
标签: c++ multithreading mutex