18
18
$ app = new LockApplication ();
19
19
20
20
$ app ->addStore ('flock ' , new FlockStore (sys_get_temp_dir ()));
21
+ $ app ->addStore ('semaphore ' , new SemaphoreStore ());
21
22
22
23
$ app ->command ('resource:reset [resource] ' , function ($ output , $ factory , $ input ) {
23
24
$ resourceName = $ input ->getArgument ('resource ' );
51
52
});
52
53
53
54
55
+ $ app ->command ('barrier ' , function (OutputInterface $ output , Factory $ factory ) {
56
+ $ processes = new UnsafeSharedResource ('processes ' );
57
+ $ barrierFlag = new UnsafeSharedResource ('barrier ' );
58
+
59
+ $ counterLock = $ factory ->createLock ('processes-counter ' );
60
+ $ barrierLock = $ factory ->createLock ('processes-barrier ' );
61
+
62
+ $ heavyWork = function () use ($ output ) {
63
+ $ output ->writeln ("Working " );
64
+ sleep (rand (1 , 5 ));
65
+ };
66
+
67
+
68
+ do {
69
+ $ processesCount = 0 ;
70
+ $ iAmFirstProcess = false ;
71
+
72
+ $ counterLock ->acquire (true );
73
+ try {
74
+ $ output ->writeln ("Waiting!! " );
75
+ $ processNumber = $ processes ->increase ();
76
+ if ($ processNumber == 1 ) {
77
+ $ barrierLock ->acquire (true );
78
+ try {
79
+ $ barrierFlag ->reset ();
80
+ } finally {
81
+ $ barrierLock ->release ();
82
+ }
83
+ }
84
+ } finally {
85
+ $ counterLock ->release ();
86
+ }
87
+
88
+ $ readBarrierFlag = 0 ;
89
+ do {
90
+ $ counterLock ->acquire (true );
91
+ try {
92
+ $ processesCount = $ processes ->read ();
93
+ if ($ processesCount == 4 ) {
94
+ $ barrierLock ->acquire (true );
95
+ try {
96
+ $ output ->writeln ("---------- " );
97
+ $ barrierFlag ->increase ();
98
+ $ processes ->reset ();
99
+ } finally {
100
+ $ barrierLock ->release ();
101
+ }
102
+ }
103
+ $ barrierLock ->acquire (true );
104
+ try {
105
+ $ readBarrierFlag = $ barrierFlag ->read ();
106
+ } finally {
107
+ $ barrierLock ->release ();
108
+ }
109
+ } finally {
110
+ $ counterLock ->release ();
111
+ }
112
+ } while ($ readBarrierFlag === 0 );
113
+
114
+ $ heavyWork ();
115
+ } while (true );
116
+ });
117
+
118
+ $ app ->command ('rw:reader ' , function (OutputInterface $ output , Factory $ factory ) {
119
+ $ resource = new UnsafeSharedResource ('very-important-thing ' );
120
+ $ readersStore = new UnsafeSharedResource ('readers ' );
121
+ $ readLock = $ factory ->createLock ('reader ' );
122
+ $ writeLock = $ factory ->createLock ('writer ' );
123
+ do {
124
+ $ readLock = $ factory ->createLock ('reader ' );
125
+ $ writeLock = $ factory ->createLock ('writer ' );
126
+
127
+ // begin read
128
+ $ readLock ->acquire (true );
129
+ $ readers = $ readersStore ->increase ();
130
+
131
+ if ($ readers == 1 ) {
132
+ $ writeLock ->acquire (true );
133
+ }
134
+ $ readLock ->release ();
135
+
136
+ // read
137
+ $ value = $ resource ->read ();
138
+ $ output ->writeln (">> Read $ value " );
139
+
140
+ // end read
141
+ $ readLock ->acquire (true );
142
+ $ readers = $ readersStore ->decrease ();
143
+ //$output->writeln(">>>> readers (end): $readers");
144
+ if ($ readers == 0 ) {
145
+ $ writeLock ->release ();
146
+ }
147
+ $ readLock ->release ();
148
+ sleep (rand (1 , 5 ));
149
+ } while (true );
150
+ });
151
+
152
+
153
+ $ app ->command ('rw:writer ' , function (OutputInterface $ output , Factory $ factory ) {
154
+ $ resource = new UnsafeSharedResource ('very-important-thing ' );
155
+ $ readLock = $ factory ->createLock ('reader ' );
156
+ $ writeLock = $ factory ->createLock ('writer ' );
157
+ do {
158
+ //begin write
159
+ $ writeLock ->acquire (true );
160
+ $ output ->writeln ('Start to write... ' );
161
+
162
+ //write
163
+ $ resource ->increase ();
164
+ sleep (5 );
165
+
166
+ //end write
167
+ $ output ->writeln ('Write finishes! ' );
168
+ $ writeLock ->release ();
169
+ } while (true );
170
+ });
171
+
172
+
54
173
$ app ->run ();
0 commit comments