Lua程式設計示例(八) 生產者 消費者問題

2022-09-26 19:06:14 字數 2063 閱讀 7476

這個問題是比較經典的啦,基本所有語言的多執行緒都會涉及到,但是沒想到lua的這個這麼複雜 抓狂

看了好長時間才算看明白,先上個邏輯圖:

開始時呼叫消費者,當消費者需要值時,再呼叫生產者生產值,生產者生產值後停止,直到消費者再次請求。設計為消費者驅動的設計。

圖畫的不太好,可以先將filter遮住,它是過濾器對兩個程式之間傳遞的資訊進行處理。去掉filter邏輯就更清晰些了,就是兩個「執行緒」(其實是兩個協同程式)互相呼叫。resume回到yield處開始,支援巢狀,返回到棧頂的yield位置。yield是非阻塞的「執行緒同步」。這到有點像linux裡的管道通訊。

function receive(prod)

print("receive is called")

local status,value = coroutine.resume(prod)

return value

endfunction send(x,prod)

print("send is called")

return coroutine.yield(x)

endfunction producer()

return coroutine.create程式設計客棧(function ()

print("producer is called")

while true do

print("producer run again")

local x = io.read()

swww.cppcns.comend(x)

endend)

endfunction filter(prod)

return coroutine.create(function ()

for line = 1,1000 do

print("enter fliter "..line)

local x = receive(prod)

print("receive in filter finished")

x= string.format("%5d %s",line,x)

send(x,prod)

endend)

endfunction consumer(prod)

print("consumer is called程式設計客棧")

while true do

print("consumer run again")

local x = receive(prod)

print("retrun customer")

io.write(x,"\n")

endendp = producer()

f=filter(p)

consumer(f)

執行結果:

consumer is called

consumer run again

receive is called

enter fliter 1

receive is called

producer is called

producer run again

fsysend is called

receive in filter finished

send is called

retrun customer

1 fs

consumer run again

receive is called

enter fliter 2

receive is called

producer run again

gaga

send is called

receive in filter finished

send is called

retrun customer

2 gaga

consumer run again

receive is called

enter fliter 3

receive is called

produc程式設計客棧er run again

......

本文位址:

5 12 生產者和消費者

一 生產者和消費者之間的關係 1 生產者將生產出來的資訊不斷存入乙個區域內,消費者將資訊從該區域內不斷讀取出來 生產者錄入資訊 消費者讀取資訊 例 電影票 public class movie public void setname string name public string getinfo...

6 1 生產者 消費者問題

在多執行緒程式中,執行緒之間通常存在分工。在一種常見模式中,一些執行緒是生產者,一些是消費者。需要強制執行幾個同步約束才能使此系統正常工作 在緩衝區中新增或刪除專案時,緩衝區處於不一致狀態。因此,執行緒必須具有對緩衝區的獨佔訪問許可權。如果消費者執行緒在緩衝區為空時到達,則會阻塞,直到生產者新增新專...

26 生產者消費者模型

一 ipc 空間復用 中記憶體隔離開了多個程序直接不能直接互動 ipc指的就是程序間通訊 幾種方式 1 建立乙個共享檔案 缺點 效率較低 優點 理論上交換的資料量可以非常大 適用於 互動不頻繁,且資料量較大的情況 2 共享記憶體 缺點 資料量不大 優點 效率高 適用於 互動頻繁,但是資料量小 3 管...