協同程序實現生產者消費者

2021-09-30 20:47:38 字數 1432 閱讀 1975

**及注釋如下,使用print函式列印值和行號,可以看到**的執行路徑

--[[

resume協程,如果協程執行的過程中呼叫yield函式,則resume函式返回yield的引數

]]function receive(prod)

local status, value = coroutine.resume(prod)

print(value, debug.getinfo(1).currentline)

return value

end--[[

若是在乙個協程裡呼叫yield函式,則會掛起當前協程

]]function send(x)

print(x, debug.getinfo(1).currentline)

coroutine.yield(x)

end--[[

建立乙個協程;生產、停止生產、將生產的東西發給消費者

]]function producer()

return coroutine.create(function ()

while true do

local x = io.read() -- 生產商品

print(x, debug.getinfo(1).currentline)

send(x) --停止生產、返回商品

endend)

end--[[

消費者是乙個迴圈,當需要消費的時候,就喚醒生產者

然後將商品列印出來

]]function consumer(prod)

while true do

local x = receive(prod) -- 從生產者那裡獲得商品

print(x, debug.getinfo(1).currentline)

io.write(x, "\n")

endendconsumer(producer())

--[[

執行結果:

hello -- 輸入

hello 27

hello 16

hello 7

hello 41

hello -- io.write輸出

]]

理解:

生產者是乙個協程,將生產者的執行過程傳給消費者「consumer(producer())」,消費者什麼時候商品需要就呼叫receive函式,讓生產者生產,然後消費掉。生產者被消費者喚醒之後「resume」,就開始生產"io.read",生產完成之後,就馬上停工"yield",將商品給消費者"yield之後,商品由resume函式返回"。

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者消費者

using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...

生產者消費者

執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...