mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-20 17:16:33 +08:00
Rework Thread hierarchy
Introduce ThreadBase struct that is search agnostic and just handles low level stuff, and derive all the other specialized classes form here. In particular TimerThread does not hinerits anymore all the search related stuff from Thread. Also some renaming while there. Suggested by Steven Edwards No functional change.
This commit is contained in:
34
src/thread.h
34
src/thread.h
@@ -86,21 +86,35 @@ struct SplitPoint {
|
||||
};
|
||||
|
||||
|
||||
/// ThreadBase struct is the base of the hierarchy from where we derive all the
|
||||
/// specialized thread classes.
|
||||
|
||||
struct ThreadBase {
|
||||
|
||||
ThreadBase() : exit(false) {}
|
||||
virtual ~ThreadBase() {}
|
||||
virtual void idle_loop() = 0;
|
||||
void notify_one();
|
||||
void wait_for(volatile const bool& b);
|
||||
|
||||
Mutex mutex;
|
||||
ConditionVariable sleepCondition;
|
||||
NativeHandle handle;
|
||||
volatile 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
|
||||
/// 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.
|
||||
|
||||
struct Thread {
|
||||
struct Thread : public ThreadBase {
|
||||
|
||||
Thread();
|
||||
virtual ~Thread() {}
|
||||
|
||||
virtual void idle_loop();
|
||||
void notify_one();
|
||||
bool cutoff_occurred() const;
|
||||
bool is_available_to(Thread* master) const;
|
||||
void wait_for(volatile const bool& b);
|
||||
|
||||
template <bool Fake>
|
||||
void split(Position& pos, Search::Stack* ss, Value alpha, Value beta, Value* bestValue, Move* bestMove,
|
||||
@@ -113,17 +127,13 @@ struct Thread {
|
||||
Position* activePosition;
|
||||
size_t idx;
|
||||
int maxPly;
|
||||
Mutex mutex;
|
||||
ConditionVariable sleepCondition;
|
||||
NativeHandle handle;
|
||||
SplitPoint* volatile activeSplitPoint;
|
||||
volatile int splitPointsSize;
|
||||
volatile bool searching;
|
||||
volatile bool exit;
|
||||
};
|
||||
|
||||
|
||||
/// MainThread and TimerThread are sublassed from Thread to characterize the two
|
||||
/// MainThread and TimerThread are derived classes used to characterize the two
|
||||
/// special threads: the main one and the recurring timer.
|
||||
|
||||
struct MainThread : public Thread {
|
||||
@@ -132,7 +142,7 @@ struct MainThread : public Thread {
|
||||
volatile bool thinking;
|
||||
};
|
||||
|
||||
struct TimerThread : public Thread {
|
||||
struct TimerThread : public ThreadBase {
|
||||
TimerThread() : msec(0) {}
|
||||
virtual void idle_loop();
|
||||
int msec;
|
||||
@@ -148,7 +158,7 @@ struct ThreadPool : public std::vector<Thread*> {
|
||||
void init(); // No c'tor and d'tor, threads rely on globals that should
|
||||
void exit(); // be initialized and valid during the whole thread lifetime.
|
||||
|
||||
MainThread* main_thread() { return static_cast<MainThread*>((*this)[0]); }
|
||||
MainThread* main() { return static_cast<MainThread*>((*this)[0]); }
|
||||
void read_uci_options();
|
||||
Thread* available_slave(Thread* master) const;
|
||||
void wait_for_think_finished();
|
||||
|
||||
Reference in New Issue
Block a user