私はいくつかのジョブをスレッドプールに投稿し、それが終了するのを待っています。時には私のワーカースレッドが凍っているように見えるので、私はここで何かを見逃してしまったのだろうかと思います。このスレッドプールの使用は安全ですか?
私のメインスレッドは、このような労働者を起動します。
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だった通常のint型、I原子になるように変更します。あなたが投稿したコードについては、numJobsPostedを減らす必要があります.1より大きい場合でも、私はオペレータの周りでロックを移動すると思います。ありがとう。 –
わかりましたので、わかりやすくするためにコードを編集します –