在共享对象中使用RLock

时间:2015-07-12 11:14:05

标签: python multithreading thread-safety mutex

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

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()

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

1 个答案:

答案 0 :(得分:0)

我认为这是保护数据的正确方法。每一种更高级的风格都与你所写的相同。

我如何写它,它做同样但更短:

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 ShareObject:
    def __init__(self):
        self.data = None

    def get(self):
        return self.data

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