这个Python代码是线程安全的吗? 导入时间 导入线程 类测试(threading.Thread): 定义初始化(自): threading.Thread.\uuuuu init\uuuuuu(自) self.doSkip=False self.count=0 def运行(自): 而self.count

这个Python代码是线程安全的吗? 导入时间 导入线程 类测试(threading.Thread): 定义初始化(自): threading.Thread.\uuuuu init\uuuuuu(自) self.doSkip=False self.count=0 def运行(自): 而self.count,python,multithreading,Python,Multithreading,线程安全的方式是什么?我看不到你想要保护的任何部分 skip可以随时重置doSkip,因此锁定它没有多大意义。您没有任何可以同时访问的资源,因此在这段代码中没有任何东西会被破坏/不安全 根据锁定/计数的不同,唯一可能运行不同的部分是每次调用.skip()时需要多少个“skip”。如果要确保每次跳过都会导致跳过对.work()的调用,则应将doSkip更改为一个计数器,该计数器受递增和比较/递减锁的保护。当前,一个线程可能在检查之后,但在重置doSkip之前,打开doSkip。在本例中这并不重要,

线程安全的方式是什么?我看不到你想要保护的任何部分

skip可以随时重置
doSkip
,因此锁定它没有多大意义。您没有任何可以同时访问的资源,因此在这段代码中没有任何东西会被破坏/不安全


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

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


但是像往常一样,您无法预测调度程序将以何种顺序阻止/运行这两个线程。

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


如果其他线程需要向您的线程类读/写数据,那么这将不是线程安全的,除非您使用某种同步机制(如锁)保护数据。

每当互斥布尔测试(例如If(self.doSkip))与互斥布尔测试集分离时,您可能会遇到线程问题

规则是,您的线程将在最不方便的时候被调出。也就是说,在测试之后和设置之前。将它们靠得更近会减少出错的机会,但不会消除它们。您几乎总是需要从语言或内核中创建一个专门的机制来完全关闭该窗口


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

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

  • 线程1:
    t.skip()
  • 线程2:
    if self.doSkip:打印“跳过”
  • 线程1:
    t.skip()
  • 线程2:
    self.doSkip=False
  • 等等
  • 换句话说,虽然您可能希望每次调用
    t.skip()
    ,都会看到一个“跳过”,但此事件序列将违反这一点

    然而,由于您的
    sleep()
    调用,我认为这一系列事件实际上是不可能的

    (除非您的计算机运行非常慢)

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