X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fthread.h;h=f530913cf22017f21fa49a2ca812dc6861b5439c;hb=856a5f3aaaf8b9d53599963decacd4476b55c034;hp=606f96262dd72ead3f3672a45c1148f840efcb97;hpb=098f645d26675bcf2180b290be77fe64a63de3ae;p=stockfish diff --git a/src/thread.h b/src/thread.h index 606f9626..f530913c 100644 --- a/src/thread.h +++ b/src/thread.h @@ -21,9 +21,6 @@ #define THREAD_H_INCLUDED #include -#include -#include -#include #include #include "material.h" @@ -38,6 +35,35 @@ const size_t MAX_THREADS = 128; const size_t MAX_SPLITPOINTS_PER_THREAD = 8; const size_t MAX_SLAVES_PER_SPLITPOINT = 4; +/// Mutex and ConditionVariable struct are wrappers of the low level locking +/// machinery and are modeled after the corresponding C++11 classes. + +struct Mutex { + Mutex() { lock_init(l); } + ~Mutex() { lock_destroy(l); } + + void lock() { lock_grab(l); } + void unlock() { lock_release(l); } + +private: + friend struct ConditionVariable; + + Lock l; +}; + +struct ConditionVariable { + ConditionVariable() { cond_init(c); } + ~ConditionVariable() { cond_destroy(c); } + + void wait(Mutex& m) { cond_wait(c, m.l); } + void wait_for(Mutex& m, int ms) { timed_wait(c, m.l, ms); } + void notify_one() { cond_signal(c); } + +private: + WaitCondition c; +}; + + /// SplitPoint struct stores information shared by the threads searching in /// parallel below the same split point. It is populated at splitting time. @@ -57,7 +83,7 @@ struct SplitPoint { SplitPoint* parentSplitPoint; // Shared variable data - std::mutex mutex; + Mutex mutex; std::bitset slavesMask; volatile bool allSlavesSearching; volatile uint64_t nodes; @@ -74,15 +100,16 @@ struct SplitPoint { struct ThreadBase { - virtual ~ThreadBase() = default; + ThreadBase() : handle(NativeHandle()), exit(false) {} + virtual ~ThreadBase() {} virtual void idle_loop() = 0; void notify_one(); void wait_for(volatile const bool& b); - std::thread nativeThread; - std::mutex mutex; - std::condition_variable sleepCondition; - volatile bool exit = false; + Mutex mutex; + ConditionVariable sleepCondition; + NativeHandle handle; + volatile bool exit; }; @@ -118,17 +145,19 @@ struct Thread : public ThreadBase { /// special threads: the main one and the recurring timer. struct MainThread : public Thread { + MainThread() : thinking(true) {} // Avoid a race with start_thinking() virtual void idle_loop(); - volatile bool thinking = true; // Avoid a race with start_thinking() + volatile bool thinking; }; struct TimerThread : public ThreadBase { static const int Resolution = 5; // Millisec between two check_time() calls + TimerThread() : run(false) {} virtual void idle_loop(); - bool run = false; + bool run; }; @@ -148,8 +177,8 @@ struct ThreadPool : public std::vector { void start_thinking(const Position&, const Search::LimitsType&, Search::StateStackPtr&); Depth minimumSplitDepth; - std::mutex mutex; - std::condition_variable sleepCondition; + Mutex mutex; + ConditionVariable sleepCondition; TimerThread* timer; };