我正在尝试实现 Reader/Writer 锁定机制来控制 3 个线程的同步,每个线程基于随机抽取骰子执行 4 次。例如,对于线程 i,调用 random.randint(1, 6),如果输出为偶数,则读取线程 i,如果为奇数,则写入线程 i。在这里,我找到了读/写锁的一般实现,但是我没有成功为 3 个线程执行这 4 个操作。这是原始代码的一部分以及我最后的补充:
import threading
import time, random
class RWLock:
def __init__(self):
self.rwlock = 0
self.writers_waiting = 0
self.monitor = threading.Lock()
self.readers_ok = threading.Condition(self.monitor)
self.writers_ok = threading.Condition(self.monitor)
def acquire_read(self):
self.monitor.acquire()
while self.rwlock < 0 or self.writers_waiting:
self.readers_ok.wait()
self.rwlock += 1
self.monitor.release()
def acquire_write(self):
self.monitor.acquire()
while self.rwlock != 0:
self.writers_waiting += 1
self.writers_ok.wait()
self.writers_waiting -= 1
self.rwlock = -1
self.monitor.release()
def release(self):
self.monitor.acquire()
if self.rwlock < 0:
self.rwlock = 0
else:
self.rwlock -= 1
wake_writers = self.writers_waiting and self.rwlock == 0
wake_readers = self.writers_waiting == 0
self.monitor.release()
if wake_writers:
self.writers_ok.acquire()
self.writers_ok.notify()
self.writers_ok.release()
elif wake_readers:
self.readers_ok.acquire()
self.readers_ok.notifyAll()
self.readers_ok.release()
rwl = RWLock()
class Reader(threading.Thread):
def run(self):
print "Thread " + str(threading.active_count()) + " is now ready for reading shard location\n"
rwl.acquire_read()
time.sleep(5)
print "Thread " + str(threading.active_count()) + " now has finished reading shard location\n"
rwl.release()
time.sleep(0.2)
self._is_running = False
class Writer(threading.Thread):
def run(self):
print "Thread " + str(threading.active_count()) + " is now ready to write to shard location\n"
rwl.acquire_write()
time.sleep(5)
print "Thread " + str(threading.active_count()) + " now has finished writing to shard location\n"
rwl.release()
time.sleep(0.2)
self._is_running = False
alpha = list("ABC")
d = {i: 4 for i in alpha}
def execute(thread):
global d
diceDraw = random.randint(1, 6)
if diceDraw % 2 == 0:
thread = Reader()
thread.start()
time.sleep(1)
else:
thread = Writer()
thread.start()
time.sleep(1)
while sum(d.values()) > 0:
for i in d.keys():
if i:
execute(i)
d[i] -= 1
有什么建议吗?