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()
答案 0 :(得分:2)
以哪种方式线程安全?我在这里看不到你想要保护的任何部分。
跳过可以随时重置doSkip
,因此锁定它没有多大意义。您没有同时访问的任何资源 - 因此IMHO在此代码中没有任何损坏/不安全。
根据锁定/计数,可能会运行不同的唯一部分是每次调用.skip()
时预计会有多少“跳过”。如果要确保每次跳过都会导致跳过对.work()
的调用,则应将doSkip
更改为受增量和比较/减量锁定保护的计数器。目前,一个线程可能会在检查后doSkip
重置doSkip
之前启用{{1}}。在这个例子中并不重要,但在某些实际情况下(代码更多),它可能会产生影响。
答案 1 :(得分:1)
每当测试互斥锁布尔值(例如if(self.doSkip))与互斥锁布尔值的集合分开时,你可能会遇到线程问题。
规则是你的线程会在最不方便的时候换掉。也就是说,在测试之后和之前。将它们靠近在一起可以减少拧紧的窗口,但不会消除它们。您几乎总是需要从语言或内核中专门创建的机制来完全关闭该窗口。
线程库具有信号量,可用于同步线程和/或创建关键的代码段。
答案 2 :(得分:0)
显然没有任何关键资源,所以我说它是线程安全的。
但是像往常一样,你无法预测调度程序阻塞/运行两个线程的顺序。
答案 3 :(得分:0)
只要不在线程之间共享数据,这就是线程安全的。
如果另一个线程需要读取/写入线程类的数据,那么除非使用某种同步机制(如锁)保护数据,否则这将不是线程安全的。
答案 4 :(得分:0)
要详细说明DanM的答案,可以想象这可能会发生:
t.skip()
if self.doSkip: print 'skipped'
t.skip()
self.doSkip = False
换句话说,虽然您可能希望每次调用t.skip()
时都会看到一个“跳过”,但这一系列事件都会违反该事件。
但是,由于您的sleep()
来电,我认为这一系列事件实际上是不可能的。
(除非您的计算机正在慢慢运行 )