]> git.sesse.net Git - stockfish/blobdiff - src/thread.h
Pick bestmove from the deepest thread.
[stockfish] / src / thread.h
index 459b1ddde9fe11daadd308bb5f717abfcc86dbd8..fd7343a8f57a1d9d2bc0f1c40f27c94ad1148098 100644 (file)
 #include "search.h"
 #include "thread_win32.h"
 
-struct Thread;
-
-const size_t MAX_THREADS = 128;
-
 
 /// ThreadBase struct is the base of the hierarchy from where we derive all the
 /// specialized thread classes.
 
 struct ThreadBase : public std::thread {
 
+  ThreadBase() { exit = false; }
   virtual ~ThreadBase() = default;
   virtual void idle_loop() = 0;
   void notify_one();
-  void wait(volatile const bool& b);
-  void wait_while(volatile const bool& b);
+  void wait(std::atomic<bool>& b);
+  void wait_while(std::atomic<bool>& b);
 
   Mutex mutex;
   ConditionVariable sleepCondition;
-  volatile bool exit = false;
+  std::atomic<bool> exit;
 };
 
 
-/// Thread struct keeps together all the thread related stuff like locks, state
-/// and especially split points. We also use per-thread pawn and material hash
+/// Thread struct keeps together all the thread related stuff like locks, state,
+/// history and countermoves tables. We also use per-thread pawn and material hash
 /// tables so that once we get a pointer to an entry its life time is unlimited
 /// and we don't have to care about someone changing the entry under our feet.
 
@@ -72,14 +69,14 @@ struct Thread : public ThreadBase {
   Endgames endgames;
   size_t idx, PVIdx;
   int maxPly;
-  volatile bool searching;
+  std::atomic<bool> searching;
 
   Position rootPos;
   Search::RootMoveVector rootMoves;
   Depth rootDepth;
-  Search::Stack stack[MAX_PLY+4];
   HistoryStats history;
   MovesStats counterMoves;
+  Depth completedDepth;
 };
 
 
@@ -87,10 +84,11 @@ 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();
   void join();
   void think();
-  volatile bool thinking = true; // Avoid a race with start_thinking()
+  std::atomic<bool> thinking;
 };
 
 struct TimerThread : public ThreadBase {
@@ -98,19 +96,20 @@ struct TimerThread : public ThreadBase {
   static const int Resolution = 5; // Millisec between two check_time() calls
 
   virtual void idle_loop();
+  void check_time();
 
   bool run = false;
 };
 
 
 /// ThreadPool struct handles all the threads related stuff like init, starting,
-/// parking and, most importantly, launching a slave thread at a split point.
+/// parking and, most importantly, launching a thread.
 /// All the access to shared thread data is done through this class.
 
 struct ThreadPool : public std::vector<Thread*> {
 
-  void init(); // No c'tor and d'tor, threads rely on globals that should be
-  void exit(); // initialized and are valid during the whole thread lifetime.
+  void init(); // No constructor and destructor, threads rely on globals that should 
+  void exit(); // be initialized and valid during the whole thread lifetime.
 
   MainThread* main() { return static_cast<MainThread*>(at(0)); }
   void read_uci_options();