当前位置: 首页 > 面试题库 >

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

百里鸿祯
2023-03-14
问题内容

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

c = 0

def increment():
  c += 1

def decrement():
  c -= 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

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



 类似资料:
  • 问题内容: 我发现以下Java代码。 其中,和是。 我知道基本类型的基本操作是线程安全的,但是我不确定。如果上述是必要的,是否可能有更好的类来处理这种操作? 问题答案: 否。该操作不是线程安全的。对于涉及分配给共享字段或数组元素的任何表达式,它要求锁定和/或适当的“先于”关系链是线程安全的。 (在字段声明为的情况下,“先发生”关系存在…但是仅在读和写操作上存在。该操作由一个读和一个写操作组成。它们

  • 问题内容: 我正在用Java编写一个程序,使一些汽车相互竞争。每辆车都是单独的线程。 当汽车完成比赛时,每个人都会调用此方法。我已经在不同的计时器速度下测试了该方法,并且看起来效果很好。但是我确实意识到每个线程都在访问变量carsComplete,有时恰好在同一时间(至少在date命令给我的范围内)。 所以我的问题是:这个方法是线程安全的吗? 问题答案: 不,您应该使用。看看它的方法。

  • 问题内容: 我注意到,通常建议使用具有多个线程的队列,而不是列表和。这是因为列表不是线程安全的,还是出于其他原因? 问题答案: 列表本身是线程安全的。在CPython中,GIL防止对它们的并发访问,而其他实现则请小心地为它们的列表实现使用细粒度锁或同步数据类型。但是,虽然列表本身不会因尝试并发访问而损坏,但列表的数据不受保护。例如: 如果另一个线程做同样的事情,则不能保证实际上将增加1,因为这不是

  • 问题内容: 有人说python字典是线程安全的。这是否意味着我可以或不能在字典中修改项目? 问题答案: 这两个概念完全不同。 线程安全性意味着两个线程无法同时修改同一对象,从而使系统处于不一致状态。 也就是说,在迭代字典时不能修改字典。请参阅文档。。 字典p在迭代过程中不应被突变。在字典上进行迭代时,修改键的值是安全的(自Python 2.1起),但前提是只要键的集合不变即可。

  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?

  • 问题内容: 我知道文档说明该对象是线程安全的,但这是否意味着从所有方法对其进行的所有访问都是线程安全的?因此,如果我一次从多个线程中调用它,并且一次在同一实例上调用它,会不会发生什么不好的事情? 问题答案: 快速答案是肯定的,它们是线程安全的。但是不要让它在那里… 首先,一个小的内部管理是一个接口,任何不是线程安全的实现都将破坏书面合同。您包括的链接是指,它具有一定的灵巧性。 您包含的链接引起了一