diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tests/readwritemutex.cpp | 59 | ||||
-rw-r--r-- | src/unstable/readwritemutex.cpp | 9 |
2 files changed, 52 insertions, 16 deletions
diff --git a/src/tests/readwritemutex.cpp b/src/tests/readwritemutex.cpp index 3ed8a49..8cb79e5 100644 --- a/src/tests/readwritemutex.cpp +++ b/src/tests/readwritemutex.cpp | |||
@@ -11,15 +11,32 @@ | |||
11 | 11 | ||
12 | using namespace Bu; | 12 | using namespace Bu; |
13 | 13 | ||
14 | #define CNT 15 | ||
15 | |||
16 | char disp[CNT*2+1]; | ||
17 | |||
14 | ReadWriteMutex mRW; | 18 | ReadWriteMutex mRW; |
15 | bool bRunning; | 19 | bool bRunning; |
16 | 20 | ||
21 | int rbase; | ||
22 | |||
23 | Mutex mDisp; | ||
24 | |||
25 | void dispUpd( char &ind, char val ) | ||
26 | { | ||
27 | mDisp.lock(); | ||
28 | ind = val; | ||
29 | println(disp); | ||
30 | mDisp.unlock(); | ||
31 | } | ||
32 | |||
17 | class Writer : public Thread | 33 | class Writer : public Thread |
18 | { | 34 | { |
19 | public: | 35 | public: |
20 | Writer( int iId ) : | 36 | Writer( int iId, char &ind ) : |
21 | iId( iId ), | 37 | iId( iId ), |
22 | rand( iId ) | 38 | rand( rbase+iId ), |
39 | ind( ind ) | ||
23 | { | 40 | { |
24 | } | 41 | } |
25 | 42 | ||
@@ -30,12 +47,15 @@ public: | |||
30 | protected: | 47 | protected: |
31 | virtual void run() | 48 | virtual void run() |
32 | { | 49 | { |
50 | usleep( rand.rand(1000000) ); | ||
33 | while( bRunning ) | 51 | while( bRunning ) |
34 | { | 52 | { |
35 | mRW.lockWrite(); | 53 | mRW.lockWrite(); |
36 | println("Writer %1 locking.").arg( iId ); | 54 | dispUpd( ind, 'W' ); |
37 | usleep( rand.rand(5,10)*100000 ); | 55 | // println("Writer %1 locking.").arg( iId ); |
38 | println("Writer %1 unlocking.").arg( iId ); | 56 | usleep( rand.rand(1,10)*10000 ); |
57 | // println("Writer %1 unlocking.").arg( iId ); | ||
58 | dispUpd( ind, ' ' ); | ||
39 | mRW.unlockWrite(); | 59 | mRW.unlockWrite(); |
40 | usleep( rand.rand(5,10)*10000 ); | 60 | usleep( rand.rand(5,10)*10000 ); |
41 | } | 61 | } |
@@ -44,14 +64,16 @@ protected: | |||
44 | private: | 64 | private: |
45 | int iId; | 65 | int iId; |
46 | RandomCmwc rand; | 66 | RandomCmwc rand; |
67 | char &ind; | ||
47 | }; | 68 | }; |
48 | 69 | ||
49 | class Reader : public Thread | 70 | class Reader : public Thread |
50 | { | 71 | { |
51 | public: | 72 | public: |
52 | Reader( int iId ) : | 73 | Reader( int iId, char &ind ) : |
53 | iId( iId ), | 74 | iId( iId ), |
54 | rand( -iId ) | 75 | rand( rbase-iId ), |
76 | ind( ind ) | ||
55 | { | 77 | { |
56 | } | 78 | } |
57 | 79 | ||
@@ -62,12 +84,15 @@ public: | |||
62 | protected: | 84 | protected: |
63 | virtual void run() | 85 | virtual void run() |
64 | { | 86 | { |
87 | usleep( rand.rand(1000000) ); | ||
65 | while( bRunning ) | 88 | while( bRunning ) |
66 | { | 89 | { |
67 | mRW.lockRead(); | 90 | mRW.lockRead(); |
68 | println("Reader %1 locking.").arg( iId ); | 91 | dispUpd( ind, 'R' ); |
69 | usleep( rand.rand(5,10)*100000 ); | 92 | // println("Reader %1 locking.").arg( iId ); |
70 | println("Reader %1 unlocking.").arg( iId ); | 93 | usleep( rand.rand(1,10)*10000 ); |
94 | // println("Reader %1 unlocking.").arg( iId ); | ||
95 | dispUpd( ind, ' ' ); | ||
71 | mRW.unlockRead(); | 96 | mRW.unlockRead(); |
72 | usleep( rand.rand(5,10)*10000 ); | 97 | usleep( rand.rand(5,10)*10000 ); |
73 | } | 98 | } |
@@ -76,26 +101,28 @@ protected: | |||
76 | private: | 101 | private: |
77 | int iId; | 102 | int iId; |
78 | RandomCmwc rand; | 103 | RandomCmwc rand; |
104 | char &ind; | ||
79 | }; | 105 | }; |
80 | 106 | ||
81 | #define CNT 5 | ||
82 | |||
83 | int main() | 107 | int main() |
84 | { | 108 | { |
85 | bRunning = true; | 109 | bRunning = true; |
110 | rbase = time( NULL ); | ||
111 | |||
112 | memset( disp, 0x20, CNT*2+1 ); | ||
113 | disp[CNT*2] = 0; | ||
86 | 114 | ||
87 | Thread **threads = new Thread*[CNT*2]; | 115 | Thread **threads = new Thread*[CNT*2]; |
88 | for( int j = 0; j < CNT; j++ ) | 116 | for( int j = 0; j < CNT; j++ ) |
89 | { | 117 | { |
90 | threads[j] = new Reader( j+1 ); | 118 | threads[j] = new Reader( j+1, disp[j+CNT] ); |
91 | threads[j+CNT] = new Writer( j+1 ); | 119 | threads[j+CNT] = new Writer( j+1, disp[j] ); |
92 | } | 120 | } |
93 | 121 | ||
94 | println("Starting."); | ||
95 | for( int j = 0; j < CNT*2; j++ ) | 122 | for( int j = 0; j < CNT*2; j++ ) |
96 | threads[j]->start(); | 123 | threads[j]->start(); |
97 | 124 | ||
98 | sleep( 10 ); | 125 | sleep( 120 ); |
99 | bRunning = false; | 126 | bRunning = false; |
100 | 127 | ||
101 | for( int j = 0; j < CNT*2; j++ ) | 128 | for( int j = 0; j < CNT*2; j++ ) |
diff --git a/src/unstable/readwritemutex.cpp b/src/unstable/readwritemutex.cpp index 3d8ac7a..62e9ee1 100644 --- a/src/unstable/readwritemutex.cpp +++ b/src/unstable/readwritemutex.cpp | |||
@@ -49,6 +49,15 @@ void Bu::ReadWriteMutex::unlockRead() | |||
49 | mRead.unlock(); | 49 | mRead.unlock(); |
50 | } | 50 | } |
51 | 51 | ||
52 | // | ||
53 | // The bWantWrite could be a counter like the read lock counter, however | ||
54 | // once a write lock occurs and bWantWrite is set at least one wite | ||
55 | // will definately occur. In practice most writes all happen one after | ||
56 | // the other anyway and this way reads get a chance to mingle in. | ||
57 | // | ||
58 | // Really, just getting all currint reads to stop so a write can happen | ||
59 | // I think is sufficient right now. | ||
60 | // | ||
52 | void Bu::ReadWriteMutex::lockWrite() | 61 | void Bu::ReadWriteMutex::lockWrite() |
53 | { | 62 | { |
54 | // Lock the read counter | 63 | // Lock the read counter |