併發程式設計經典問題之吸菸者。本文簡單介紹了問題模型,並提供了一種 python3 的解決方式。
問題模型
問題拓展
問題分析
talk is cheap, show me code
from threading import thread,condition,lock,current_thread
from random import randint
from copy import deepcopy
from time import sleep
# 定義捲菸材料
res_glu = 0 # 膠水
res_***** = 1 # 紙張
res_tobac = 2 # 菸葉
res_all = [res_glu, res_*****, res_tobac]
conv =
# 供貨者
def supplier(res_con, res_desk):
print("supplier started", flush=true)
res_con.acquire()
while true:
res = deepcopy(res_all)
loss = randint(0,2)
res.remove(loss) # 隨機得到兩種材料
print("supplier data ready except: " + conv[loss], flush=true)
res_con.notify_all()
res_con.wait()
# 捲菸、抽菸
def make_cigar(src):
sleep(1)
# 吸菸者
waked_count = 0
def nicotian(res_con, res_desk, res):
global waked_count
th = current_thread()
print("nicotian[" + th.name + "] with " + conv[res] + " started", flush=true)
res_con.acquire()
while true:
res_con.wait()
waked_count += 1
if res_desk and (res not in res_desk[0]):
make_cigar(res_desk.pop())
print("nicotian with " + conv[res] + " has smoked\n", flush=true)
if waked_count == 3:
if res_desk:
print("error: 材料沒有被使用", flush=true)
exit()
waked_count = 0
res_con.notify()
def main():
# 材料桌,初始為空,**者放入材料,吸菸者取出材料
res_desk =
# 材料狀態控制
res_con = condition(lock())
# 吸菸者
res_list = res_all # 給吸菸者分配材料
thread_nic =
for res in res_list:
thread_nic[-1].start()
sleep(1)
# **者
thread_supp = thread(target=supplier, args=(res_con, res_desk), daemon=true)
thread_supp.start()
input("\n\n===enter any key to exit===\n\n")
if __name__ == '__main__':
main()
參考文件 吸菸者問題
吸菸者問題是作業系統中p v操作部分的經典同步問題,深刻理解吸菸者問題對我們學習作業系統有著很大的益處!1.問題描述 三個吸菸者在乙個房間內,還有乙個香菸 者。為了製造並抽掉香菸,每個吸菸者需要三樣東西 菸草 紙和火柴,者有豐富貨物提供。三個吸菸者中,第乙個有自己的菸草,第二個有自己的紙,第三個有自...
王道考研 吸菸者問題
假設乙個系統有三個抽菸者和乙個 者程序。每個抽菸者不停地捲菸並抽掉它,但是要捲起並抽掉一支煙,抽菸者需要有三種材料 菸草 紙和膠水。三個抽菸者中,第乙個擁有菸草 第二個擁有紙 第三個擁有膠水。者程序無限地提供三種材料,者每次將兩種材料放桌子上,擁有剩下那種材料的抽菸者卷一根煙並抽掉它,並給 者程序乙...
作業系統 吸菸者問題
這次介紹的幾個ipc inter process communication 程序間的通訊問題,加上上篇部落格介紹的生產者 消費者問題及其變形,都是非常經典的ipc問題,在王道老師講解的時候,彈幕一片 秒啊 666 這幾個問題的解決方案也著實讓人著迷,當我帶著懷疑去驗證時候,又有一種豁然開朗的感覺,...