2016-07-23 42 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