2012-03-05 2 views
1

Есть ли способ для потоков lua lanes для связи или доступа к потокам извне?lua lanes связь между потоками

Без использования циклов занятости, как указано в документации.

Простым примером может быть поток, использующий переменную, обновление, изменение его и т. Д., А также другой поток или основную программу, чтобы иметь возможность получить/получить эту переменную.

Возможно ли это с lua-полосами?

И я имею в виду чисто в lua не из c/C++.

ответ

4

При использовании нескольких потоков, обычно do not want to "update/change" a variable from multiple threads without any synchronization - это может привести к случайному образом появляются ошибки, вызванных несинхронизированным доступом к переменным/таблицам и т.д.

Вместо этого, вы должны полагаться на передачу сообщений для обработки связи между потоками. Это называется actor model и поддерживается непосредственно некоторыми языками, такими как Erlang.

LuaLanes также охватывает эту модель связи. Для связи между различными полосами вы создаете объект Linda, который может совместно использоваться основным потоком и порожденными потоками и использоваться для связи. Объекты Linda обрабатывают синхронизацию для вас, не требуется блокировка с вашей стороны. Каждая операция (отправка, получение сообщения) является атомарной.

Без использования оживленных петель ...

Хотя это может показаться, что это, нет заняты петель в LuaLanes. Если вы попытаетесь установить linda:receive() на ключ без значения, LuaLanes puts the reading thread on a wait до тех пор, пока объект линды не будет изменен. Таким образом, общий способ для обработки потоков сообщений выглядит следующим образом:

local lanes = require "lanes" 
local linda = lanes.linda() 
local thread = lanes.gen("*", function() 
    print("Starting thread...") 
    while true do 
     local command = linda:receive("cmd") 
     if command=="quit" then 
      break 
     else 
      -- do processing based on command 
     end 
    end 
end) 

local threads = {} 
local NCORES = 4 
for i=1,NCORES do threads[i] = thread() end  -- start the threads 
-- send messages, like files for processing, using linda:send("cmd", {file=..., op=...}) 
for i=1,NCORES do linda:send("cmd", "quit") end -- send the quit command 
for i=1,NCORES do threads[i]:join() end   -- wait for the threads to end 
+0

Вы создали полную противоположность тому, что я имел в виду. Но пропуская вперед. Есть ли способ сказать отправить объект, а затем собрать его или прочитать его спустя некоторое время, скажем, 5 минут. Пока он не читает то же самое milisecond, что его посылает, для которого требуется «цикл занятости» или тот, который ставит его в ожидании. И не используя цикл занятости. Простой пример: поток отправляет объект через некоторое время, я могу его собирать/читать или нет, используя один «прием» или что-то подобное, например. – user1058431

+0

Я до сих пор не совсем понимаю, чего вы хотите. Вы имеете в виду, что хотите начать поток с аргументом («отправить объект») обрабатывать его в потоке и возвращать обработанный объект из потока («читать позже»)? Это поддерживается непосредственно LuaLanes, вы просто передаете аргумент как 'thread (object)', и вы можете прочитать первое возвращаемое значение 'threads [i] [1]' в любое время позже. –

+0

Нет, я имею в виду «пока» его запуск. Он не уйдет после выполнения маленькой вещи, это цикл продолжения. Сам поток. И в то время как это происходит, мне нужно отправить свои данные, чтобы либо основной поток, либо другой поток могли читать из него и использовать его. – user1058431

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