0

我正在尝试实现 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

有什么建议吗?

4

0 回答 0