2016-07-23 22 views
0

So habe ich einige Threads, wo ich gerne einen Upvalue namens Reset auf jeden Thread einmal so oft übergeben würde, um die Werte jedes Thread-Tabelle zurückgesetzt. Ich möchte dann den Reset ausschalten, bis die Tabelle die Chargen durchlaufen hat. Allerdings hatte ich keinen Erfolg beim Ausschalten des Reset (Reset = false), scheint es nicht zu stoppen, es kontinuierlich zurückzusetzen.Fackel-Threads - Daten zwischen Main und Threads einmal übertragen

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 

Antwort

1

Ihr Upvalue "Reset" ist hier schreibgeschützt. Der Thread serialisiert "reset" und liest es. Bei jeder Wiederholung in der "while" -Schleife wird reset also erneut von Threads gelesen und serialisiert: addjob.

Was scheinen Sie stattdessen zu wollen, ist es zu brechen auf diese Weise nach unten:

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

ist das Hochladen ein Wert von __resetflag = true für jeden Thread? Ich scheine nur, dass dies für einen der Threads ausgeführt wird. – mattdns

+0

Ich habe gerade zurückgesetzt: addjob() in einer Schleife, bis alle von ihnen zurückgesetzt wurden. Das ist großartig, danke. – mattdns