好的,首先检查以下代码:class DemoClass(): def __init__(self): #### 我真的想知道 self.Counter 是否是线程安全的。 self.Counter = 0 def Increase(self): ...
好的,首先检查以下代码:
class DemoClass():
def __init__(self):
#### I really want to know if self.Counter is thread-safe.
self.Counter = 0
def Increase(self):
self.Counter = self.Counter + 1
def Decrease(self):
self.Counter = self.Counter - 1
def DoThis(self):
while True:
Do something
if A happens:
self.Increase()
else:
self.Decrease()
time.sleep(randomSecs)
def DoThat(self):
while True:
Do other things
if B happens:
self.Increase()
else:
self.Decrease()
time.sleep(randomSecs)
def ThreadSafeOrNot(self):
InterestingThreadA = threading.Thread(target = self.DoThis, args = ())
InterestingThreadA.start()
InterestingThreadB = threading.Thread(target = self.DoThat, args = ())
InterestingThreadB.start()
我遇到了与上述相同的情况。我真的想知道它是否是线程安全的 self.Counter
,如果不是,我有什么选择?我只能想到 threading.RLock()
锁定此资源,有什么更好的主意吗?
使用实例字段 self.Counter
是 线程安全的或“原子的” ( 或此处 )。读取它或分配 一个 值 - 即使它需要 4 个字节的内存,您也永远不会得到半更改的值。但操作 self.Counter = self.Counter + 1
不是,因为它读取该值然后写入它 - 另一个线程可以在读取之后和写回之前更改字段的值。
所以您需要用锁来保护整个操作。
由于方法主体基本上就是整个操作,因此您可以使用装饰器来执行此操作。请参阅此答案以获取示例: https://.com/a/490090/34088