X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fthread.cpp;h=cdb0d5412a501b781e4064815eacf255b358ef66;hp=a715d44ee17b2e5844e4be101b246041e9bc9c7d;hb=3c0fe1d9b252acca8107b7bece636e2bc20d6411;hpb=26dabb1e6bcd8035f0f3516c4358a73f2b041a1c diff --git a/src/thread.cpp b/src/thread.cpp index a715d44e..cdb0d541 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(); } @@ -200,21 +200,22 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes assert(!searching); assert(!activePosition); - searching = true; - // We have returned from the idle loop, which means that all threads are // finished. Note that decreasing splitPointsSize must be done under lock // protection to avoid a race with Thread::can_join(). - sp.spinlock.acquire(); + spinlock.acquire(); + searching = true; --splitPointsSize; activeSplitPoint = sp.parentSplitPoint; activePosition = &pos; + + spinlock.release(); + + // Split point data cannot be changed now, so no need to lock protect pos.set_nodes_searched(pos.nodes_searched() + sp.nodes); *bestMove = sp.bestMove; *bestValue = sp.bestValue; - - sp.spinlock.release(); } @@ -299,9 +300,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 } @@ -318,10 +322,6 @@ void ThreadPool::read_uci_options() { assert(requested > 0); - // If zero (default) then set best minimum split depth automatically - if (!minimumSplitDepth) - minimumSplitDepth = requested < 8 ? 4 * ONE_PLY : 7 * ONE_PLY; - while (size() < requested) push_back(new_thread()); @@ -353,8 +353,6 @@ void ThreadPool::start_thinking(const Position& pos, const LimitsType& limits, StateStackPtr& states) { main()->join(); - SearchTime = now(); // As early as possible - Signals.stopOnPonderhit = Signals.firstRootMove = false; Signals.stop = Signals.failedLowAtRoot = false;