-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathexer03b_readers_writers.py
66 lines (43 loc) · 1.37 KB
/
exer03b_readers_writers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
'''
THE READERS-WRITERS PROBLEM
Solution for the third readers-writers problem
'''
import random
import time
import threading
class GlobalData:
def __init__(self):
self.resource = 0
self.reader_count = 0
self.lk_resource = threading.Lock()
self.lk_reader_count = threading.Lock()
self.lk_service_queue = threading.Lock()
def do_task_writer(g: GlobalData, delay_time: int):
time.sleep(delay_time)
with g.lk_service_queue:
g.lk_resource.acquire()
g.resource = random.randint(0, 99)
print('Write', g.resource)
g.lk_resource.release()
def do_task_reader(g: GlobalData, delay_time: int):
time.sleep(delay_time)
with g.lk_service_queue:
# Increase reader count
with g.lk_reader_count:
g.reader_count += 1
if g.reader_count == 1:
g.lk_resource.acquire()
# Do the reading
print('Read', g.resource)
# Decrease reader count
with g.lk_reader_count:
g.reader_count -= 1
if g.reader_count == 0:
g.lk_resource.release()
gbl_data = GlobalData()
NUM_READERS = 8
NUM_WRITERS = 6
for _ in range(NUM_READERS):
threading.Thread(target=do_task_reader, args=(gbl_data, random.randint(0, 2))).start()
for _ in range(NUM_WRITERS):
threading.Thread(target=do_task_writer, args=(gbl_data, random.randint(0, 2))).start()