在共享对象中使用 RLock

Using RLock inside shared object

我有两个线程,每个线程都需要访问一些共享对象。为了保护这个对象的数据,我这样定义它:

class ShareObject:
    def __init__(self):
        self.mutex = threading.RLock()
        self.data = None

    def get(self):
        self.mutex.acquire()
        result = self.data
        self.mutex.release()
        return result

    def set(self, data):
        self.mutex.acquire()
        self.data = data
        self.mutex.release()

这是使用互斥锁保护共享数据的正确方法吗?

我认为这是保护数据的正确方法。每一个更高级的风格都会等同于你写的。

我会怎么写,它的作用相同但更短:

class ShareObject:
    def __init__(self):
        self.mutex = threading.Lock()
        self.data = None

    def get(self):
        with self.mutex: # with unlocks the mutex even if there is an error or return
            return self.data

    def set(self, data):
        with self.mutex:
            self.data = data

    # more methods

如果getset是class唯一的方法并且没有人使用mutex属性,你也可以这样写:

class ShareObject:
    def __init__(self):
        self.data = None

    def get(self):
        return self.data

    def set(self, data):
        self.data = data