这个Python代码线程安全吗?

时间:2009-04-17 22:33:41

标签: python multithreading

import time
import threading

class test(threading.Thread):
    def __init__ (self):
      threading.Thread.__init__(self)
      self.doSkip = False
      self.count = 0

    def run(self):
      while self.count<9:
         self.work()

    def skip(self):
      self.doSkip = True

    def work(self):
      self.count+=1
      time.sleep(1)
      if(self.doSkip):
        print "skipped"
        self.doSkip = False
        return
      print self.count

t = test()
t.start()
while t.count<9:
  time.sleep(2)
  t.skip()

5 个答案:

答案 0 :(得分:2)

以哪种方式线程安全?我在这里看不到你想要保护的任何部分。

跳过可以随时重置doSkip,因此锁定它没有多大意义。您没有同时访问的任何资源 - 因此IMHO在此代码中没有任何损坏/不安全。

根据锁定/计数,可能会运行不同的唯一部分是每次调用.skip()时预计会有多少“跳过”。如果要确保每次跳过都会导致跳过对.work()的调用,则应将doSkip更改为受增量和比较/减量锁定保护的计数器。目前,一个线程可能会在检查后doSkip重置doSkip之前启用{{1}}。在这个例子中并不重要,但在某些实际情况下(代码更多),它可能会产生影响。

答案 1 :(得分:1)

每当测试互斥锁布尔值(例如if(self.doSkip))与互斥锁布尔值的集合分开时,你可能会遇到线程问题。

规则是你的线程会在最不方便的时候换掉。也就是说,在测试之后和之前。将它们靠近在一起可以减少拧紧的窗口,但不会消除它们。您几乎总是需要从语言或内核中专门创建的机制来完全关闭该窗口。

线程库具有信号量,可用于同步线程和/或创建关键的代码段。

答案 2 :(得分:0)

显然没有任何关键资源,所以我说它是线程安全的。

但是像往常一样,你无法预测调度程序阻塞/运行两个线程的顺序。

答案 3 :(得分:0)

只要不在线程之间共享数据,这就是线程安全的。

如果另一个线程需要读取/写入线程类的数据,那么除非使用某种同步机制(如锁)保护数据,否则这将不是线程安全的。

答案 4 :(得分:0)

要详细说明DanM的答案,可以想象这可能会发生:

  1. 主题1:t.skip()
  2. 主题2:if self.doSkip: print 'skipped'
  3. 主题1:t.skip()
  4. 主题2:self.doSkip = False
  5. 换句话说,虽然您可能希望每次调用t.skip()时都会看到一个“跳过”,但这一系列事件都会违反该事件。

    但是,由于您的sleep()来电,我认为这一系列事件实际上是不可能的。

    (除非您的计算机正在慢慢运行