У меня похожая проблема:
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 value
и Result = DemoVar
будут запускаться первыми, поскольку оба они являются атомарной операцией (правильно я, если я не прав), что означает Result = DemoVar
может быть небезопасно, если в пуле слишком много потоков. Решение, которое я могу придумать, это добавить time.sleep(0.01)
после DemoRLock.acquire()
, чтобы убедиться, что Result = DemoVar
запускается первым, но это может снизить производительность. Есть идея получше?