Samchon Framework for CPP  1.0.0
RWMutex.cpp
1 #include <samchon/library/RWMutex.hpp>
2 
3 #include <atomic>
4 #include <mutex>
5 #include <condition_variable>
6 
7 using namespace std;
8 using namespace samchon::library;
9 
10 RWMutex::RWMutex()
11 {
12  readingCount = new atomic<size_t>(0);
13  isWriting = new atomic<bool>(false);
14 
15  cv = new condition_variable();
16  readMtx = new mutex();
17  writeMtx = new mutex();
18  minusMtx = new mutex();
19 }
20 RWMutex::~RWMutex()
21 {
22  delete readingCount;
23  delete isWriting;
24 
25  delete readMtx;
26  delete writeMtx;
27  delete minusMtx;
28  delete cv;
29 }
30 
31 void RWMutex::readLock() const
32 {
33  unique_lock<mutex> uk(*readMtx);
34  while (*isWriting == true)
35  cv->wait(uk);
36 
37  readingCount->operator++();
38 }
39 void RWMutex::readUnlock() const
40 {
41  unique_lock<mutex> uk(*minusMtx);
42 
43  //Â÷°¨ Àü ÀÌ¹Ì 0 (°úµµÇÑ readUnlock ¼öÇà) Àº ¾È µÊ if ( *readingCount != 0 && readingCount->operator--() == 0 ) { cv->notify_all(); } } void RWMutex::writeLock() { unique_lock<mutex> uk(*writeMtx); while (*isWriting == true || *readingCount > 0) cv->wait(uk); isWriting->store( true ); } void RWMutex::writeUnlock() { isWriting->store( false ); cv->notify_all(); }
44  if (
45  *readingCount != 0 &&
46  readingCount->operator--() == 0
47  )
48  {
49  cv->notify_all();
50  }
51 }
52 
53 void RWMutex::writeLock()
54 {
55  unique_lock<mutex> uk(*writeMtx);
56  while (*isWriting == true || *readingCount > 0)
57  cv->wait(uk);
58 
59  isWriting->store( true );
60 }
61 void RWMutex::writeUnlock()
62 {
63  isWriting->store( false );
64  cv->notify_all();
65 }
Definition: RWMutex.hpp:4
Package of libraries.
Definition: library.hpp:84