mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-22 01:56:58 +08:00
Introduce Spinlock class
Initialization is more complex than what I'd like due to MSVC compatibility that for some reason does not like: std::atomic_flag lock = ATOMIC_FLAG_INIT; No functional change.
This commit is contained in:
14
src/thread.h
14
src/thread.h
@@ -20,6 +20,7 @@
|
||||
#ifndef THREAD_H_INCLUDED
|
||||
#define THREAD_H_INCLUDED
|
||||
|
||||
#include <atomic>
|
||||
#include <bitset>
|
||||
#include <condition_variable>
|
||||
#include <mutex>
|
||||
@@ -69,6 +70,19 @@ struct SplitPoint {
|
||||
};
|
||||
|
||||
|
||||
/// Spinlock class wraps low level atomic operations to provide spin lock functionality
|
||||
|
||||
class Spinlock {
|
||||
|
||||
std::atomic_flag lock;
|
||||
|
||||
public:
|
||||
Spinlock() { std::atomic_flag_clear(&lock); }
|
||||
void acquire() { while (lock.test_and_set(std::memory_order_acquire)) {} }
|
||||
void release() { lock.clear(std::memory_order_release); }
|
||||
};
|
||||
|
||||
|
||||
/// ThreadBase struct is the base of the hierarchy from where we derive all the
|
||||
/// specialized thread classes.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user