X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fsearch.cpp;h=22bc0156705121a9a02adfcd8b59c1ff66e21997;hb=8a504d36f9b740c6d4c5bba6855148c5be40556e;hp=fbae76d7720fee3dd5833697b0b70be412428b5c;hpb=093dd8fe88d278db6cd5c956a771a45a295e1de3;p=stockfish diff --git a/src/search.cpp b/src/search.cpp index fbae76d7..22bc0156 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -2793,9 +2793,12 @@ namespace { #else WaitForSingleObject(SitIdleEvent[threadID], INFINITE); #endif - Threads[threadID].sleeping = false; } + // Out of the while loop to avoid races in case thread is woken up but + // while condition still holds true so that is put to sleep again. + Threads[threadID].sleeping = false; + // If this thread has been assigned work, launch a search if (Threads[threadID].workIsWaiting) { @@ -3051,6 +3054,8 @@ namespace { { for (int i = 1; i < ActiveThreads; i++) { + assert(Threads[i].sleeping == true); + Threads[i].idle = true; Threads[i].workIsWaiting = false; } @@ -3063,6 +3068,10 @@ namespace { for (int i = 1; i < THREAD_MAX; i++) SetEvent(SitIdleEvent[i]); #endif + + // Wait for the threads to be all woken up + for (int i = 1; i < ActiveThreads; i++) + while (Threads[i].sleeping); } }