import time
import threading
from threading import Semaphore
import random
Rcount = 0
Wcount = 0
Wmutex = Semaphore(1)
Rmutex = Semaphore(1)
File = Semaphore(1)
Wirte = Semaphore(1)
def reader(i):
print('reader'+str(i)+' waiting to read\n', end='')
Wirte.acquire()
Rmutex.acquire()
global Rcount
if Rcount == 0:
File.acquire()
Rcount += 1
Rmutex.release()
Wirte.release()
print('reader'+str(i)+' reading\n', end='')
time.sleep(random.randint(1, 5))
print('reader'+str(i)+' finish read\n', end='')
Rmutex.acquire()
Rcount -= 1
if Rcount == 0:
File.release()
Rmutex.release()
def writer(i):
print('writer'+str(i)+' waiting to write\n', end='')
Wmutex.acquire()
global Wcount
if Wcount == 0:
Wirte.acquire()
Wcount += 1
Wmutex.release()
File.acquire()
print('writer'+str(i)+' writing\n', end='')
time.sleep(random.randint(1, 5))
print('writer'+str(i)+' finish write\n', end='')
File.release()
Wmutex.acquire()
Wcount -= 1
if Wcount == 0:
Wirte.release()
Wmutex.release()
if __name__ == '__main__':
times = 10
rwlist = []
for _ in range(times):
rwlist.append(random.randint(0, 1))
print(rwlist)
print('其中1表示读者进程,0表示写者进程')
rindex = 1
windex = 1
for i in rwlist:
if i == 1:
t = threading.Thread(target=reader, args=(rindex, ))
rindex += 1
t.start()
else:
t = threading.Thread(target=writer, args=(windex, ))
windex += 1
t.start()
读者与写者问题