Fully yielding locks, no spinning
authorJoona Kiiski <joona.kiiski@gmail.com>
Sat, 14 Mar 2015 21:20:11 +0000 (21:20 +0000)
committerJoona Kiiski <joona.kiiski@gmail.com>
Tue, 24 Mar 2015 21:34:19 +0000 (21:34 +0000)
7 threads:

ELO: 2.00 +-2.7 (95%) LOS: 92.4%
Total: 20000 W: 3276 L: 3161 D: 13563

There is no functional change in single thread mode

Resolves #304

src/thread.h

index ee7fb061229e0288ce163eda0ac944bda6118cb6..e880b01c6fc95dc2da7ca7c8e09b648030ce3bf2 100644 (file)
@@ -48,8 +48,8 @@ public:
   Spinlock() { lock = 1; } // Init here to workaround a bug with MSVC 2013
   void acquire() {
       while (lock.fetch_sub(1, std::memory_order_acquire) != 1)
-          for (int cnt = 0; lock.load(std::memory_order_relaxed) <= 0; ++cnt)
-              if (cnt >= 10000) std::this_thread::yield(); // Be nice to hyperthreading
+          while (lock.load(std::memory_order_relaxed) <= 0)
+              std::this_thread::yield(); // Be nice to hyperthreading
   }
   void release() { lock.store(1, std::memory_order_release); }
 };