定義
我們考慮兩個流程,分別稱為「生產者」和「消費者」。生產者是一個循環過程,每次循環都會產生一定部分的訊息,這些訊息必須由消費者處理。消費者也是一個循環過程,每次它經歷它的週期時,它都可以處理下一個訊息,因為它是由生產者產生的。計算過程給出了一個簡單的例子,該計算過程產生由穿孔卡打孔的穿孔卡的「資訊部分」圖像,穿孔卡扮演消費者的角色。 [1]
解釋
生產者建立專案並將其儲存在資料結構中,而消費者從該結構中刪除項目並處理它們。
如果消費大於生產,則緩衝區(資料結構)清空,消費者沒有什麼可消費的
如果消耗量小於生產量,則緩衝區已滿,生產者無法增加更多項目。這是一個經典問題,稱為有限緩衝區。
問題的情境化
假設我們有一個生產者在緩衝區中發布一封電子郵件,以及一個消費者使用緩衝區中的電子郵件並顯示一條訊息,說明已使用所提供的電子郵件的新訪問密碼發送了一封電子郵件。 ]
去實施
包主
進口 (
“FMMT”
“你”
“strcon”
“同步”
“團隊”
)
類型緩衝區結構 {
項目[]字串
mu同步互斥體
}
func (buff *buffer) add(項目字串) {
buff.mu.Lock()
延遲 buff.mu.Unlock()
if len(buff.items)
package main
import (
"fmt"
"os"
"strconv"
"sync"
"time"
)
type buffer struct {
items []string
mu sync.Mutex
}
func (buff *buffer) add(item string) {
buff.mu.Lock()
defer buff.mu.Unlock()
if len(buff.items)
解釋實施
首先,我們建立一個名為- buffer 的結構,其中包含一個名為items 的字串陣列和一個名為mu 的類似互斥體的控制機制,用於管理並發存取。
我們有兩個函數:一個稱為add,它基本上將一個項目添加到緩衝區中,只要有可用空間,因為緩衝區容量只有5 個項目;另一個get 調用,如果緩衝區中有項目,則傳回第一個元素並從緩衝區中刪除該元素。 -
- Producer 基本上從循環中獲取索引,並將其連接成一個名為str 的字串,其中包含索引和虛擬電子郵件域,並將其添加到緩衝區。新增了時間間隔來模擬延遲。
- 消費者從緩衝區請求一個項目(如果它至少有一個項目)。然後,消費者在螢幕上顯示一條訊息,通知已發送一封電子郵件,其中包含緩衝區中發布的項目的新存取密碼。
程式碼連結: https://github.com/jcelsocosta/race_condition/blob/main/ Producerconsumer/buffer/ Producerconsumer.go
參考
https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD123.html#4.1。通用信號量的典型用途。 -
參考書目
https://www.cin.ufpe.br/~cagf/if677/2015-2/slides/08_Concorrencia (Jorge).pdf