windows - lua baner kommunikation mellem tråde

Indlæg af Hanne Mølgaard Plasc

Problem



Er der en måde at for lua baner tråde at kommunikere eller at få adgang til trådene uden for det?


Uden at bruge travle løkker som dokumentationen giver.


Et simpelt eksempel ville være, en tråd, der bruger en variabel, ajourfører den, ændrer den osv. Og en anden tråd eller hovedprogrammet for at få adgang til/få den variabel.


Er det muligt med lua baner?


Og jeg mener rent i lua ikke fra c/c ++.

Bedste reference


Mens du bruger flere tråde, vil du normalt ikke 'opdatere/ændre' en variabel fra flere tråde uden nogen synkronisering - dette kan medføre tilfældige fejl ved usynkroniseret adgang til variabler/tabeller mv. [3]


I stedet bør du stole på, at du sender besked til håndtering af kommunikation mellem tråde. Dette kaldes skuespillermodellen og støttes direkte af nogle sprog, som Erlang. [4]


LuaLanes omfatter også denne kommunikationsmodel. For at kommunikere mellem forskellige baner skaber du et Linda-objekt, som kan deles af hovedtråden og fremspringede tråde og bruges til at kommunikere. Linda-objekter håndterer synkronisering til dig, det er ikke nødvendigt at låse fra din side. Hver handling (afsendelse, modtagelse af en besked) er atomisk. [5] [6]



  Uden at bruge travle løkker ...



Selv om det kan virke som om det, er der ingen travle løkker i LuaLanes. Hvis du forsøger at linda:receive() på en nøgle uden værdi, lægger LuaLanes læsetråden på vent, indtil linda-objektet er ændret. Så den generelle måde for en tråd til at håndtere beskederne er som følger: [7]


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