簡體   English   中英

如何確保共享變量是線程安全的?

[英]How to make sure shared variables are thread-safe?

我面臨類似的問題:

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)之后添加DemoRLock.acquire() time.sleep(0.01)以確保Result = DemoVar首先運行,但這會損失一些生產力。 有更好的主意嗎?

您要從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
     ....

現在,每次我嘗試與多個線程交換/共享信息時,我都會立即轉到Queue模塊,這更加方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM