lua通道线程之间的通信

时间:2012-03-05 19:00:47

标签: windows linux multithreading lua

是否有办法让lua通道线程进行通信或从外部访问线程?

不使用文档提供的繁忙循环。

一个简单的例子是,使用变量的线程,更新它,更改它等等,另一个线程或主程序能够访问/获取该变量。

这是否可以使用lua lanes?

我的意思纯粹是在lua而不是来自c / c ++。

1 个答案:

答案 0 :(得分: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直到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