OS 訊號量(一) 生產者消費者問題

2021-08-21 15:18:25 字數 2662 閱讀 9719

自己作業系統學的不咋樣,這學期剛學完也就趁熱打鐵鞏固一下吧(話說考完就沒再碰過,欸)。以此為契機拿這個演算法練練手順便加深印象,其他經典同步互斥演算法之後會慢慢更。

首先是生產者消費者問題,自己碼的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提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執...