ソースを参照

Merge pull request #4588 from ReinUsesLisp/tsan-event

common/thread: Fix data race in is_set
bunnei 5 年 前
コミット
ad9ce67b52
1 ファイル変更5 行追加4 行削除
  1. 5 4
      src/common/thread.h

+ 5 - 4
src/common/thread.h

@@ -4,6 +4,7 @@
 
 
 #pragma once
 #pragma once
 
 
+#include <atomic>
 #include <chrono>
 #include <chrono>
 #include <condition_variable>
 #include <condition_variable>
 #include <cstddef>
 #include <cstddef>
@@ -25,13 +26,13 @@ public:
 
 
     void Wait() {
     void Wait() {
         std::unique_lock lk{mutex};
         std::unique_lock lk{mutex};
-        condvar.wait(lk, [&] { return is_set; });
+        condvar.wait(lk, [&] { return is_set.load(); });
         is_set = false;
         is_set = false;
     }
     }
 
 
     bool WaitFor(const std::chrono::nanoseconds& time) {
     bool WaitFor(const std::chrono::nanoseconds& time) {
         std::unique_lock lk{mutex};
         std::unique_lock lk{mutex};
-        if (!condvar.wait_for(lk, time, [this] { return is_set; }))
+        if (!condvar.wait_for(lk, time, [this] { return is_set.load(); }))
             return false;
             return false;
         is_set = false;
         is_set = false;
         return true;
         return true;
@@ -40,7 +41,7 @@ public:
     template <class Clock, class Duration>
     template <class Clock, class Duration>
     bool WaitUntil(const std::chrono::time_point<Clock, Duration>& time) {
     bool WaitUntil(const std::chrono::time_point<Clock, Duration>& time) {
         std::unique_lock lk{mutex};
         std::unique_lock lk{mutex};
-        if (!condvar.wait_until(lk, time, [this] { return is_set; }))
+        if (!condvar.wait_until(lk, time, [this] { return is_set.load(); }))
             return false;
             return false;
         is_set = false;
         is_set = false;
         return true;
         return true;
@@ -54,9 +55,9 @@ public:
     }
     }
 
 
 private:
 private:
-    bool is_set = false;
     std::condition_variable condvar;
     std::condition_variable condvar;
     std::mutex mutex;
     std::mutex mutex;
+    std::atomic_bool is_set{false};
 };
 };
 
 
 class Barrier {
 class Barrier {