2011-12-01 194 views
1

我面临着类似的问题:如何确保共享变量是线程安全的?

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先运行,但这会损失一些生产力。有什么更好的想法

+1

我在理解您的设置时遇到问题。例如,如果我有一个运行'DecideAfterDemo'方法100次的for循环,它们不会因'NewThread.join()'而并行运行。如果你有一些并行运行线程的替代方法,你是否可以给你的代码呢? – jsalonen

+0

@jsalonen:在'SpawnThreads'中''DecideAfterDemo'作为线程运行,但由于'NewThread.join()'在某些时候很多'DecideAfterDemo'会像并行运行 – Shane

+0

感谢您的编辑。现在更有意义。 – jsalonen

回答

1

你想要的是从DemoMultiThreadMethod发送一些值(DemoVar)给DecideAfterDemo。虽然你可以使用一些消息传递库,最简单的方法是定义线程类......像这样(未经):每次

class DemoMultiThread(threading.Thread): 
    def __init__(self, mode): 
     self.mode = mode 
     threading.Thread.__init__(self) 
    def run(run): 
     mode = self.mode 
     DemoRLock.acquire() 
     ... 
     self.result = DemoVar 
     DemoRLock.release() 

def DecideAfterDemo(self): 
    NewThread = DemoMultiThread(mode) 
    NewThread.start() 
    NewThread.join() 
    Result = NewThread.result 
    .... 
0

现在,当我尝试交换多线程/共享信息,我马上去Queue模块,这样比较方便。

相关问题