X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fsearch.cpp;h=9a373dec456223cfbac60cd4ce8729adbf3d7a13;hb=ccad6013892a95574e7c3ec652f3e03c357d10b7;hp=c5c5b94470fed9365831fea28427db4d4070d0e5;hpb=d165d5af914c3c925fb7ba53fbd63dfb2de92f5d;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index c5c5b944..9a373dec 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -1626,13 +1626,8 @@ void Thread::idle_loop() { assert(!this_sp || (this_sp->masterThread == this && searching)); - // If this thread is the master of a split point and all slaves have finished - // their work at this split point, return from the idle loop. - while (!this_sp || this_sp->slavesMask) + while (true) { - if (this_sp) - this_sp->mutex.unlock(); - // If we are not searching, wait for a condition to be signaled instead of // wasting CPU time polling for work. while ((!searching && Threads.sleepWhileIdle) || exit) @@ -1725,8 +1720,16 @@ void Thread::idle_loop() { sp->mutex.unlock(); } - if(this_sp) + // If this thread is the master of a split point and all slaves have finished + // their work at this split point, return from the idle loop. + if (this_sp && !this_sp->slavesMask) + { this_sp->mutex.lock(); + bool finished = !this_sp->slavesMask; // Retest under lock protection + this_sp->mutex.unlock(); + if (finished) + return; + } } }