При использовании нескольких потоков вы обычно не хотите «обновлять / изменять» переменную из нескольких потоков без какой-либо синхронизации - это может привести к случайному появлению ошибок, вызванных несинхронизированным доступом к переменным / таблицам, и т.д.
Вместо этого вы должны полагаться на передачу сообщений для управления связью между потоками. Это называется модель актера и поддерживается некоторыми языками, такими как Erlang.
LuaLanes также охватывает эту модель общения. Для связи между различными линиями вы создаете объект Linda , который может использоваться главным потоком и порожденными потоками и использоваться для связи. Объекты Linda обрабатывают синхронизацию для вас, блокировка с вашей стороны не требуется. Каждая операция (отправка, получение сообщения) является атомарной.
Без использования занятых циклов ...
Хотя может показаться, что в LuaLanes нет занятых циклов. Если вы попытаетесь linda:receive()
на ключе без значения, LuaLanes заставит поток чтения ждать , пока объект linda не будет изменен. Поэтому общий способ обработки сообщений потоком выглядит следующим образом:
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