Logo ROOT   6.12/07
Reference Guide
TSpinMutex.hxx
Go to the documentation of this file.
1 // @(#)root/thread
2 // Author: Danilo Piparo, 2016
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TSpinMutex
13 #define ROOT_TSpinMutex
14 
15 #include <atomic>
16 
17 namespace ROOT {
18 
19  /**
20  * \class ROOT::TSpinMutex
21  * \brief A spin mutex class which respects the STL interface for mutexes.
22  * \ingroup Multicore
23  * This class allows to acquire spin locks also in combination with templates in the STL such as
24  * <a href="http://en.cppreference.com/w/cpp/thread/unique_lock">std::unique_lock</a> or
25  * <a href="http://en.cppreference.com/w/cpp/thread/condition_variable_any">std::condition_variable_any</a>.
26  * For example:
27  * ~~~ {.cpp}
28  * ROOT::TSpinMutex m;
29  * std::condition_variable cv;
30  * bool ready = false;
31  *
32  * void worker_thread()
33  * {
34  * // Wait until main() sends data
35  * std::unique_lock<ROOT::TSpinMutex> lk(m);
36  * cv.wait(lk, []{return ready;});
37  * [...]
38  * ~~~ {.cpp}
39  */
40  class TSpinMutex {
41 
42  private:
43  std::atomic_flag fAFlag = ATOMIC_FLAG_INIT;
44 
45  public:
46  TSpinMutex() = default;
47  TSpinMutex(const TSpinMutex&) = delete;
48  ~TSpinMutex() = default;
49  TSpinMutex& operator=(const TSpinMutex&) = delete;
50 
51  void lock() { while (fAFlag.test_and_set(std::memory_order_acquire)); }
52  void unlock() { fAFlag.clear(std::memory_order_release); }
53  bool try_lock() { return !fAFlag.test_and_set(std::memory_order_acquire); }
54 
55  };
56 }
57 
58 #endif
TSpinMutex & operator=(const TSpinMutex &)=delete
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21
std::atomic_flag fAFlag
Definition: TSpinMutex.hxx:43
A spin mutex class which respects the STL interface for mutexes.
Definition: TSpinMutex.hxx:40
TSpinMutex()=default
~TSpinMutex()=default