「走進計算機深處」 Linux 執行緒(三)

2021-10-04 14:35:25 字數 1658 閱讀 6939

前言:執行緒(二)主要學習了執行緒安全管理,同步與互斥的作用,明白了互斥鎖和等待佇列的使用場景和方法,這篇部落格主要闡述其發生場景,生產者與消費者模型。

模型如下:

模型優點:

1.支援忙閒不均

2.支援併發

3.解耦合(讓兩個模組產生更小的關聯性)

模型關係分析:

生產者與生產者應該具備互斥關係

消費者與消費者應該具備互斥關係

生產者與消費者應該具備同步+互斥關係(同步:我放了資料你才能取,互斥:我放完了你才能取)

總結:乙個場所,兩類角色,三種關係

**實現:

1.使用c++封裝實現乙個執行緒安全的佇列

blockingqueue

在多執行緒程式設計中阻塞佇列(blocking queue)是一種常用於實現生產者和消費者模型的資料結構。其與普通的佇列區

別在於,當隊列為空時,從佇列獲取元素的操作將會被阻塞,直到佇列中被放入了元素;當佇列滿時,往佇列裡存

放元素的操作也會被阻塞,直到有元素被從佇列中取出(以上的操作都是基於不同的執行緒來說的,執行緒在對阻塞佇列程序操作時會被阻塞)

**如下:

#include

#include

#include

#include

#define num 8

class blockqueue

void

unlockqueue()

void

productwait()

void

consumewait()

void

notifyproduct()

void

notifyconsume()

bool isempty()

bool isfull()

public:

blockqueue

(int _cap = num)

:cap

(_cap)

void

pushdata

(const

int&data)

q.push

(data)

;unlockqueue()

;}void

popdata

(int

&data)

data = q.

front()

; q.

pop();

unlockqueue()

;}~blockqueue()

};void

*consumer

(void

*arg)

}void

*producter

(void

*arg)

}int

main()

「走進計算機深處」 Linux 執行緒(一)

競爭條件 多個執行流競爭執行 函式的可重入和不可重入 函式的重入 多個執行流同時進入乙個函式執行 可重入 函式重入不會造成資料二義,或者邏輯混亂 不可重入 函式重入可能造成資料二義,或者邏輯混亂 關鍵點 是否對全域性資料進行非原子安全操作 原子操作指不可被打斷 sigghld訊號 子程序退出後作業系...

「走進計算機深處」 Linux 程序(一)

什麼是程序?程序是為了提高cpu的執行效率,減少因為程式等待帶來的cpu空轉以及其他計算機硬體資源浪費而提出的。描述程序 pcb 程序資訊被放在乙個叫做程序控制塊的資料結構中,可以理解為程序屬性的集合。課本上稱之為pcb process control block linux作業系統下pcb是tas...

計算機視覺(三)

1 sigmoid函式不再適用的原因 1 在某些情況下梯度會消失,不利於反向傳播,例如,當輸如的值過大或過小時,根據函式的影象,返回的梯度都會是0,阻斷了梯度的反向傳播。2 不是以0為中心,梯度更新低效 拿sigmoid舉例,不是以零為中心,會造成其反向傳播的導數不是正就是負,假設w是乙個二維向量,...