Луа Лейнс связь между потоками - PullRequest
1 голос
/ 05 марта 2012

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

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

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

Возможно ли это с помощью lua lanes?

ИЯ имею в виду чисто в lua, а не из c / c ++.

1 Ответ

4 голосов
/ 05 марта 2012

При использовании нескольких потоков вы обычно не хотите «обновлять / изменять» переменную из нескольких потоков без какой-либо синхронизации - это может привести к случайному появлению ошибок, вызванных несинхронизированным доступом к переменным / таблицам, и т.д.

Вместо этого вы должны полагаться на передачу сообщений для управления связью между потоками. Это называется модель актера и поддерживается некоторыми языками, такими как 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...