При использовании нескольких потоков, обычно 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
Вы создали полную противоположность тому, что я имел в виду. Но пропуская вперед. Есть ли способ сказать отправить объект, а затем собрать его или прочитать его спустя некоторое время, скажем, 5 минут. Пока он не читает то же самое milisecond, что его посылает, для которого требуется «цикл занятости» или тот, который ставит его в ожидании. И не используя цикл занятости. Простой пример: поток отправляет объект через некоторое время, я могу его собирать/читать или нет, используя один «прием» или что-то подобное, например. – user1058431
Я до сих пор не совсем понимаю, чего вы хотите. Вы имеете в виду, что хотите начать поток с аргументом («отправить объект») обрабатывать его в потоке и возвращать обработанный объект из потока («читать позже»)? Это поддерживается непосредственно LuaLanes, вы просто передаете аргумент как 'thread (object)', и вы можете прочитать первое возвращаемое значение 'threads [i] [1]' в любое время позже. –
Нет, я имею в виду «пока» его запуск. Он не уйдет после выполнения маленькой вещи, это цикл продолжения. Сам поток. И в то время как это происходит, мне нужно отправить свои данные, чтобы либо основной поток, либо другой поток могли читать из него и использовать его. – user1058431