Я отправляю несколько заданий в threadpool, а затем жду, пока он закончит. Мне интересно, если я что-то пропустил, потому что иногда мои рабочие потоки замерзают.Безопасно ли использование этого потока?
Мой основной поток запустить рабочих, как это:
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();
}
}
ли выше код безопасным, или мне нужно сделать, чтобы поставить замок вокруг оператор декремента?
Да так numJobsPosted был регулярным ИНТ, я Я изменю его, чтобы он был атомарным. О коде, который вы опубликовали, я, конечно же, должен уменьшить numJobsPosted, даже если он больше 1, я предполагаю, что сейчас просто заблокирую замок вокруг оператора. Благодарю. –
Хорошо, я отредактирую код соответственно для ясности –