From 16594bdd1f90a38caf5393770825a5c9a973cbcc Mon Sep 17 00:00:00 2001 From: Calcitem Date: Sat, 3 Oct 2020 00:12:25 +0800 Subject: [PATCH] =?UTF-8?q?thread:=20mutex=20=E5=92=8C=20cv=20=E7=94=B1=20?= =?UTF-8?q?Qt=20=E6=9B=BF=E6=8D=A2=E4=B8=BA=20STL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/aithread.cpp | 37 +++++++++++++++++-------------------- src/aithread.h | 8 ++++---- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/aithread.cpp b/src/aithread.cpp index 649a446f..9e077a38 100644 --- a/src/aithread.cpp +++ b/src/aithread.cpp @@ -65,7 +65,7 @@ AiThread::~AiThread() void AiThread::setAi(Position *p) { - mutex.lock(); + std::lock_guard lk(mutex); this->rootPos = p; setPosition(p); @@ -75,17 +75,15 @@ void AiThread::setAi(Position *p) TranspositionTable::clear(); #endif #endif - - mutex.unlock(); } void AiThread::setAi(Position *p, int tl) { - mutex.lock(); + std::lock_guard lk(mutex); + this->rootPos = p; setPosition(p); timeLimit = tl; - mutex.unlock(); } void AiThread::emitCommand() @@ -247,6 +245,8 @@ out: void AiThread::run() { + std::unique_lock lk(mutex, std::defer_lock); + #ifdef DEBUG_MODE int iTemp = 0; #endif @@ -258,19 +258,19 @@ void AiThread::run() bestvalue = lastvalue = VALUE_ZERO; while (!isInterruptionRequested()) { - mutex.lock(); + lk.lock(); sideToMove = rootPos->sideToMove; if (sideToMove != us) { - pauseCondition.wait(&mutex); - mutex.unlock(); + pauseCondition.wait(lk); + lk.unlock(); continue; } setPosition(rootPos); emit searchStarted(); - mutex.unlock(); + lk.unlock(); #ifdef OPENING_BOOK // gameOptions.getOpeningBook() @@ -297,11 +297,11 @@ void AiThread::run() emit searchFinished(); - mutex.lock(); + lk.lock(); if (!isInterruptionRequested()) { - pauseCondition.wait(&mutex); + pauseCondition.wait(lk); } - mutex.unlock(); + lk.unlock(); } loggerDebug("Thread %d quit\n", us); @@ -312,16 +312,14 @@ void AiThread::act() if (isFinished() || !isRunning()) return; - mutex.lock(); + std::lock_guard lk(mutex); quit(); - mutex.unlock(); } void AiThread::resume() { - mutex.lock(); - pauseCondition.wakeAll(); - mutex.unlock(); + std::lock_guard lk(mutex); + pauseCondition.notify_one(); // Wake up anyone } void AiThread::stop() @@ -331,10 +329,9 @@ void AiThread::stop() if (!isInterruptionRequested()) { requestInterruption(); - mutex.lock(); + std::lock_guard lk(mutex); quit(); - pauseCondition.wakeAll(); - mutex.unlock(); + pauseCondition.notify_one(); // Wake up anyone } } diff --git a/src/aithread.h b/src/aithread.h index 2c7b8b98..11073f30 100644 --- a/src/aithread.h +++ b/src/aithread.h @@ -20,9 +20,9 @@ #ifndef AITHREAD_H #define AITHREAD_H +#include +#include #include -#include -#include #include #include "position.h" #include "search.h" @@ -36,8 +36,8 @@ class AiThread : public QThread Q_OBJECT private: - QMutex mutex; - QWaitCondition pauseCondition; + std::mutex mutex; + std::condition_variable pauseCondition; string strCommand;