2016-07-23 80 views
0

因此,我有一些線程,我希望每隔一段時間傳遞一次稱爲復位的upvalue,以便重置每個線程的表值。然後我想關閉重置,直到表完成迭代通過其批次。然而,我沒有成功關閉重置(reset = false)似乎並沒有阻止它不斷重置。火炬線程 - 在主線程和線程之間傳輸數據一次

for i = 1, n do 
    local reset = true 
    while true do 
      threads:addjob(
       function() 
        if reset = true then f:reset(); reset = false; end 
        x,y = f:getBatch() 
        return x,y 
       end, 
       function(x,y) 
        -- do some stuff and trigger conditionMet = true if met 
       end 
      ) 
      if conditionMet == true break end 

    end 
end 

回答

1

您的upvalue「reset」在這裏是只讀的。線程序列化「重置」並讀取它。因此,在「while」循環中的每次迭代都會被線程再次讀取和序列化:addjob。

你似乎想要代替什麼是這種方式打破它:

for i = 1, n do 
threads:addjob(
      function() 
       __resetflag = true 
      end 
) 
while true do 
     threads:addjob(
      function() 
       if __resetflag == true then f:reset(); __resetflag = false; end 
       x,y = f:getBatch() 
       return x,y 
      end, 
      function(x,y) 
       -- do some stuff and trigger conditionMet = true if met 
      end 
     ) 
     if conditionMet == true break end 

end 
end 
+0

這是上傳__resetflag =真到每個線程的值?我似乎只得到這個執行的線程之一。 – mattdns

+0

我剛剛將reset:addjob()放在一個循環中,直到所有這些都被重置。非常感謝。 – mattdns