windows - lua車道之間的線程通信



linux multithreading (1)

在使用多線程時,通常不希望從多個線程更新/更改變量而不進行任何同步 - 這可能會導致隨機訪問變量/表等引起的隨機出現的錯誤。

相反,您應該依靠消息傳遞來處理線程之間的通信。 這被稱為actor模型,並且被一些語言直接支持,比如Erlang。

LuaLanes也包含這種溝通模式。 為了在各個通道之間進行通信,需要創建一個Linda對象,它可以被主線程和派生線程共享,並用於通信。 琳達對象為你處理同步,不需要從你身邊的鎖定。 每個操作(發送,接收消息)都是原子的。

不使用繁忙的循環...

雖然看起來像是這樣,但LuaLanes中沒有繁忙的循環。 如果你嘗試linda:receive()在沒有值的鍵上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

有沒有辦法讓lua lannel線程進行通信或從外部訪問線程?

不要使用文檔提供的繁忙循環。

一個簡單的例子是,一個線程使用一個變量,更新它,改變它等另一個線程或主程序能夠訪問/獲取該變量。

lua車道可以嗎?

我的意思是純粹在l​​ua中,而不是從c / c ++。





lua