X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fthread.cpp;h=c73f55660330545d300857b2874287fd54b21563;hp=b4958ea32e22417527357b2b734e90fb0bf4eae8;hb=2ca142a5b4ca200c56cb99495ec51a804983d07d;hpb=9a6cfee73bbad3051f888e6b8f8e88293763bf70 diff --git a/src/thread.cpp b/src/thread.cpp index b4958ea3..c73f5566 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -38,9 +38,9 @@ namespace { // when start_routine (and hence virtual idle_loop) is called and when joining. template T* new_thread() { - T* th = new T(); - th->nativeThread = std::thread(&ThreadBase::idle_loop, th); // Will go to sleep - return th; + std::thread* th = new T; + *th = std::thread(&T::idle_loop, (T*)th); // Will go to sleep + return (T*)th; } void delete_thread(ThreadBase* th) { @@ -50,7 +50,7 @@ namespace { th->mutex.unlock(); th->notify_one(); - th->nativeThread.join(); // Wait for thread termination + th->join(); // Wait for thread termination delete th; } @@ -61,7 +61,7 @@ namespace { void ThreadBase::notify_one() { - std::unique_lock(this->mutex); + std::unique_lock lk(mutex); sleepCondition.notify_one(); } @@ -251,7 +251,7 @@ void MainThread::idle_loop() { while (!thinking && !exit) { - Threads.sleepCondition.notify_one(); // Wake up the UI thread if needed + sleepCondition.notify_one(); // Wake up the UI thread if needed sleepCondition.wait(lk); } @@ -271,6 +271,15 @@ void MainThread::idle_loop() { } +// MainThread::join() waits for main thread to finish the search + +void MainThread::join() { + + std::unique_lock lk(mutex); + sleepCondition.wait(lk, [&]{ return !thinking; }); +} + + // ThreadPool::init() is called at startup to create and launch requested threads, // that will go immediately to sleep. We cannot use a c'tor because Threads is a // static object and we need a fully initialized engine at this point due to @@ -290,9 +299,12 @@ void ThreadPool::init() { void ThreadPool::exit() { delete_thread(timer); // As first because check_time() accesses threads data + timer = nullptr; for (Thread* th : *this) delete_thread(th); + + clear(); // Get rid of stale pointers } @@ -311,7 +323,7 @@ void ThreadPool::read_uci_options() { // If zero (default) then set best minimum split depth automatically if (!minimumSplitDepth) - minimumSplitDepth = requested < 8 ? 4 * ONE_PLY : 7 * ONE_PLY; + minimumSplitDepth = 5 * ONE_PLY ; while (size() < requested) push_back(new_thread()); @@ -337,23 +349,12 @@ Thread* ThreadPool::available_slave(const SplitPoint* sp) const { } -// ThreadPool::wait_for_think_finished() waits for main thread to finish the search - -void ThreadPool::wait_for_think_finished() { - - std::unique_lock lk(main()->mutex); - sleepCondition.wait(lk, [&]{ return !main()->thinking; }); -} - - // ThreadPool::start_thinking() wakes up the main thread sleeping in // MainThread::idle_loop() and starts a new search, then returns immediately. void ThreadPool::start_thinking(const Position& pos, const LimitsType& limits, StateStackPtr& states) { - wait_for_think_finished(); - - SearchTime = now(); // As early as possible + main()->join(); Signals.stopOnPonderhit = Signals.firstRootMove = false; Signals.stop = Signals.failedLowAtRoot = false;