Sleeping Wombat Common Library  0.50.0
swCommonLibrary
ReaderWriterLock.h
Go to the documentation of this file.
1 #pragma once
2 
9 #include <atomic>
10 #include <mutex>
11 
12 namespace sw
13 {
14 
15 
16 
19 {
20 private:
21 
22  std::mutex m_resourceLock;
23  std::mutex m_readersLock;
24  int m_numReaders;
25 
26 protected:
27 public:
28  explicit ReaderWriterLock () = default;
29  ~ReaderWriterLock () = default;
30 
31 
32  inline void ReaderLock ();
33  inline void ReaderUnlock ();
34  inline void WriterLock ();
35  inline void WriterUnlock ();
36 };
37 
38 
39 //====================================================================================//
40 // Implementation
41 //====================================================================================//
42 
43 
44 // ================================ //
45 //
46 inline void ReaderWriterLock::ReaderLock ()
47 {
48  std::lock_guard< std::mutex > guard( m_readersLock );
49 
50  int prevVal = m_numReaders++;
51  if( prevVal == 0 )
52  m_resourceLock.lock();
53 }
54 
55 // ================================ //
56 //
57 inline void ReaderWriterLock::ReaderUnlock ()
58 {
59  std::lock_guard< std::mutex > guard( m_readersLock );
60 
61  int curVal = --m_numReaders;
62  if( curVal == 0 )
63  m_resourceLock.unlock();
64 }
65 
66 // ================================ //
67 //
68 inline void ReaderWriterLock::WriterLock ()
69 {
70  m_resourceLock.lock();
71 }
72 
73 // ================================ //
74 //
75 inline void ReaderWriterLock::WriterUnlock ()
76 {
77  m_resourceLock.unlock();
78 }
79 
80 } // sw
81 
82 
83 
Definition: Exception.h:11
Readers-Writers problem solution with readers preference.
Definition: ReaderWriterLock.h:18