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

Ваше перевыполнение «сброс» здесь доступно только для чтения. Поток сериализует «перезагрузку» и читает его. Поэтому каждая итерация в цикле «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

Я только что положил сброс: addjob() в цикле, пока все они не будут сброшены. Это большое спасибо. – mattdns

Смежные вопросы