這個問題是比較經典的啦,基本所有語言的多執行緒都會涉及到,但是沒想到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 管...