-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreader-writer.py
113 lines (77 loc) · 3.2 KB
/
reader-writer.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import threading
import time
global_counter = 0
class ReaderWriter():
def __init__(self):
self.rd = threading.Lock() #initializing Locks using Lock class in threading module for reading and wrting
self.wrt = threading.Lock()
self.readCount = 0 #initializing number of reader present
def reader(self):
global global_counter
while True:
self.rd.acquire() #wait on read Lock
self.readCount+=1 #increase count for reader by 1
if self.readCount == 1: #since reader is present, prevent writing on data
self.wrt.acquire() #wait on write Lock
self.rd.release() #sinal on read Lock
# print(f"> READER {self.readCount}: value of global counter : ",global_counter,'\n',"-"*20)
print(f"> READER {self.readCount}: value of global counter : {global_counter}\n--------------------")
self.rd.acquire() #wait on read Lock
self.readCount-=1 #reading performed by reader hence decrementing readercount
if self.readCount == 0: #if no reader is present allow writer to write the data
self.wrt.release() # signal on write semphore, now writer can write
self.rd.release() #sinal on read Lock
time.sleep(1)
def writer(self):
global global_counter
while True:
self.wrt.acquire() #wait on write Lock
# print("> WRITER :") # write the data
print(f"> WRITER : global counter updated! \n--------------------")
global_counter = global_counter + 1
# print(" global counter updated!")
# print("-"*20)
self.wrt.release() #sinal on write Lock
time.sleep(1)
# def main(self):
# calling mutliple readers and writers
# t1 = threading.Thread(target = self.reader)
# t1.start()
# t2 = threading.Thread(target = self.writer)
# t2.start()
# t3 = threading.Thread(target = self.reader)
# t3.start()
# t4 = threading.Thread(target = self.reader)
# t4.start()
# t6 = threading.Thread(target = self.writer)
# t6.start()
# t5 = threading.Thread(target = self.reader)
# t5.start()
if __name__=="__main__":
rw = ReaderWriter()
t1 = threading.Thread(target=rw.reader)
t1.start()
t2 = threading.Thread(target=rw.writer)
t2.start()
t3 = threading.Thread(target=rw.reader)
t3.start()
t4 = threading.Thread(target=rw.writer)
t4.start()
t5 = threading.Thread(target=rw.reader)
t5.start()
t6 = threading.Thread(target=rw.writer)
t6.start()
# c = ReaderWriter()
# c.main()
# t1 = threading.Thread(target = self.reader)
# t1.start()
# t2 = threading.Thread(target = self.writer)
# t2.start()
# t3 = threading.Thread(target = self.reader)
# t3.start()
# t4 = threading.Thread(target = self.reader)
# t4.start()
# t5 = threading.Thread(target = self.writer)
# t5.start()
# t6 = threading.Thread(target = self.reader)
# t6.start()