小编典典

\+ =运算符在Python中是线程安全的吗?

python

我想创建一个非线程安全的代码块进行实验,这些是2个线程将要调用的函数。

c = 0

def increment():
  c += 1

def decrement():
  c -= 1

此代码线程安全吗?

如果不是,我可以理解为什么它不是线程安全的,以及通常使用哪种语句导致非线程安全的操作。

如果它是线程安全的,如何使它显式地成为非线程安全的?


阅读 194

收藏
2020-12-20

共1个答案

小编典典

由于有GIL,单个操作码是线程安全的,但除此之外:

import time
class something(object):
    def __init__(self,c):
        self.c=c
    def inc(self):
        new = self.c+1 
        # if the thread is interrupted by another inc() call its result is wrong
        time.sleep(0.001) # sleep makes the os continue another thread
        self.c = new


x = something(0)
import threading

for _ in range(10000):
    threading.Thread(target=x.inc).start()

print x.c # ~900 here, instead of 10000

*多个线程共享的 *每个 资源都 必须 有一个锁。

2020-12-20