首页 文章

如何确保共享变量是线程安全的?

提问于
浏览
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 等待处理,你真的不知道 DemoVar = 0 #### or random valueResult = DemoVar 中哪一个会先运行,因为它们都是原子操作(如果我错了就纠正我),如果池中的线程太多,则 Result = DemoVar 可能不安全 . 我能想到的解决方案是在 DemoRLock.acquire() 之后添加 time.sleep(0.01) 以确保 Result = DemoVar 先运行,但这会失去一些 生产环境 力 . 有什么好主意吗?

2 回答

  • 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 模块,这样更方便 .

相关问题