自己作業系統學的不咋樣,這學期剛學完也就趁熱打鐵鞏固一下吧(話說考完就沒再碰過,欸)。以此為契機拿這個演算法練練手順便加深印象,其他經典同步互斥演算法之後會慢慢更。
首先是生產者消費者問題,自己碼的python3**,難免會有錯誤,歡迎指正。**如下
# -!- coding=utf-8 -!-
import threading
import time
import random
storage = 10 # 倉庫容量
product = 5 # 當前產品數目
productornum = 3 # 生產者數目
consumernum = 3 # 消費者數目
empty = threading.semaphore(storage-product)
full = threading.semaphore(product)
mutex = threading.semaphore(1) # 互斥鎖,同一時刻只允許乙個人進入倉庫
class productor(threading.thread):
def __init__(self, name):
threading.thread.__init__(self)
self.setname(name)
def run(self):
global product # 使用全域性變數product,下同
while true:
empty.acquire() # 倉庫有空閒位置?
# 臨界區 begin
mutex.acquire()
product += 1
print('product:', self.getname(), '\t+'+"■"*product +
"□"*(storage-product), product) # 日誌資訊
mutex.release()
# 臨界區 end
full.release()
time.sleep(random.random())
print("end product")
class consumer(threading.thread):
def __init__(self, name):
threading.thread.__init__(self)
self.setname(name)
def run(self):
global product
while true:
full.acquire() # 有物品可以獲得?
# 臨界區 begin
mutex.acquire()
product -= 1
print("consume:", self.getname(), "\t-"+"■"*product +
"□"*(storage-product), product) # 日誌資訊
mutex.release()
# 臨界區 end
empty.release() # 空餘位置+1
time.sleep(random.random())
print("end consume")
# 建立生產者執行緒
for i in range(productornum):
p = productor("p"+str(i))
p.start()
# 建立消費者執行緒
for i in range(consumernum):
c = consumer("c"+str(i))
c.start()
# 掛起主程序
suspend = threading.semaphore(0)
suspend.acquire()
以下是部分輸出結果
consume: c2 -■■■■■■■■■□ 9
product: p1 +■■■■■■■■■■ 10
consume: c0 -■■■■■■■■■□ 9
product: p2 +■■■■■■■■■■ 10
consume: c1 -■■■■■■■■■□ 9
product: p0 +■■■■■■■■■■ 10
consume: c0 -■■■■■■■■■□ 9
product: p1 +■■■■■■■■■■ 10
consume: c1 -■■■■■■■■■□ 9
consume: c0 -■■■■■■■■□□ 8
product: p2 +■■■■■■■■■□ 9
consume: c2 -■■■■■■■■□□ 8
product: p0 +■■■■■■■■■□ 9
product: p1 +■■■■■■■■■■ 10
consume: c0 -■■■■■■■■■□ 9
product: p2 +■■■■■■■■■■ 10
consume: c1 -■■■■■■■■■□ 9
product: p1 +■■■■■■■■■■ 10
consume: c2 -■■■■■■■■■□ 9
以上,結束。 6 1 生產者 消費者問題
在多執行緒程式中,執行緒之間通常存在分工。在一種常見模式中,一些執行緒是生產者,一些是消費者。需要強制執行幾個同步約束才能使此系統正常工作 在緩衝區中新增或刪除專案時,緩衝區處於不一致狀態。因此,執行緒必須具有對緩衝區的獨佔訪問許可權。如果消費者執行緒在緩衝區為空時到達,則會阻塞,直到生產者新增新專...
使用訊號量實現生產者 消費者問題
問題描述 使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品 只有緩衝區不為空,消費者才可以拿走物品。因為緩衝區屬於臨界資源,因此需要使用乙個互斥量 mutex 來控制對緩衝區的互斥訪問。為了同步生產者和消費者的行為,需要記錄緩衝區中物品的數量。數量可以使用訊號量來進行統計,這裡需要使...
Linux訊號量機制(生產者消費者)
該程式為linux訊號量機制實現程式,主要模擬了一般的生產者 消費者問題。生產者 消費者問題是乙個經典的程序同步問題,該問題最早由dijkstra提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執...