我面临着类似的问题:如何确保共享变量是线程安全的?
DemoVar = 100 #### or whatever
def DemoMultiThreadMethod(mode):
DemoRLock.acquire()
DemoVar = 0 #### or random value
...
Other resources which do not support multi-threaded access
if mode == 0:
do A with DemoVar
elif mode == 1:
do B with DemoVar
...
DemoRLock.release()
...
def DecideAfterDemo(self):
NewThread = threading.Thread(target = DemoMultiThreadMethod, args = (RandomMode,))
NewThread.start()
NewThread.join()
Result = DemoVar
if Result == SpecificValue:
Do something
else:
Do another
...
...
def SpawnThreads(self):
#### hundreds of DecideAfterDemo running
Counter = 0
while Counter < 1000:
SpawnAThread = threading.Thread(target = DecideAfterDemo, args =())
SpawnAThread.Start()
...
我怎样才能确保它的安全运行Result = DemoVar
?
我的意思是,如果有万吨锁定DemoMultiThreadMethod
s表示正在等待被处理的,你真的不知道其中DemoVar = 0 #### or random value
一个Result = DemoVar
将首先运行,因为他们两人都是原子操作(纠正我,如果我错误),这意味着Result = DemoVar
可能不安全,如果池中有太多的线程。我能想到的解决方案是在DemoRLock.acquire()
之后添加time.sleep(0.01)
以确保Result = DemoVar
先运行,但这会损失一些生产力。有什么更好的想法
我在理解您的设置时遇到问题。例如,如果我有一个运行'DecideAfterDemo'方法100次的for循环,它们不会因'NewThread.join()'而并行运行。如果你有一些并行运行线程的替代方法,你是否可以给你的代码呢? – jsalonen
@jsalonen:在'SpawnThreads'中''DecideAfterDemo'作为线程运行,但由于'NewThread.join()'在某些时候很多'DecideAfterDemo'会像并行运行 – Shane
感谢您的编辑。现在更有意义。 – jsalonen