【发布时间】:2017-03-12 17:47:19
【问题描述】:
我将几个作业发布到线程池,然后等待它完成。我想知道我是否在这里遗漏了什么,因为有时我的工作线程似乎冻结了。
我的主线程这样启动工人:
numJobsPosted = 0;
for(auto entry : list)
{
numJobsPosted++;
threadPool->post(std::bind(&Controller::workerFunc, this, entry));
}
std::unique_lock<std::mutex> lock(m_workerLock);
while(numJobsPosted > 0)
{
m_workerCondition.wait(lock);
}
现在我的 workerFunc 看起来像这样:
void Controller::workerFunc(Entry entry)
{
// do some work with entry
// notify finished
numJobsPosted--;
if(numJobsPosted <= 0)
{
// does the look need to be around the numJobsPosted-- ?
std::unique_lock<std::mutex> locker(m_workerLock);
m_workerCondition.notify_one();
}
}
上面的代码安全吗,还是我需要在减量运算符周围加锁?
【问题讨论】:
标签: c++ multithreading thread-safety locking threadpool