生產者消費者執行緒間通訊模型

2021-10-23 02:47:21 字數 1648 閱讀 4504

#include

"pch.h"

#include

#include

#include

#include

#include

// c++ stl所有的容器都不是執行緒安全

using

namespace std;

#if 0

/*unique_lock condition_variable

1.lock_guard和unique_lock

2.condition_variable wait和notify_all方法

*/std::mutex mtx;

// pthread_mutex_t

std::condition_variable cv;

// pthread_condition_t

intmain()

/*c++多執行緒程式設計 - 執行緒間的同步通訊機制

多執行緒程式設計兩個問題:

1.執行緒間的互斥

竟態條件 =》 臨界區**段 =》 保證原子操作 =》互斥鎖mutex 輕量級的無鎖實現cas

strace ./a.out mutex => pthread_mutex_t

2.執行緒間的同步通訊

生產者,消費者執行緒模型

*/std::mutex mtx;

// 定義互斥鎖,做執行緒間的互斥操作

std::condition_variable cv;

// 定義條件變數,做執行緒間的同步通訊操作

// 生產者生產乙個物品,通知消費者消費乙個;消費完了,消費者再通知生產者繼續生產物品

class

queue

que.

push

(val)

;/*

notify_one:通知另外的乙個執行緒的

notify_all:通知其它所有執行緒的

通知其它所有的執行緒,我生產了乙個物品,你們趕緊消費吧

其它執行緒得到該通知,就會從等待狀態 =》 阻塞狀態 =》 獲取互斥鎖才能繼續執行

*/cv.

notify_all()

; cout <<

"生產者 生產:"

<< val <<

"號物品"

<< endl;

}int

get(

)// 消費物品

int val = que.

front()

; que.

pop();

cv.notify_all()

;// 通知其它執行緒我消費完了,趕緊生產吧

cout <<

"消費者 消費:"

<< val <<

"號物品"

<< endl;

return val;

}private

: queue<

int> que;};

void

producer

(queue *que)

// 生產者執行緒

}void

consumer

(queue *que)

// 消費者執行緒

}int

main()

#endif

執行緒間通訊 生產者消費者模型

所謂的執行緒間通訊,其實就是多個執行緒再操作同乙個資源,但是操作的動作不同。當某個執行緒進入synchronized塊後,共享資料的狀態不一定滿足該執行緒的需要,需要其他執行緒改變共享資料的狀態後才能執行,而由於當時執行緒對共享資源時獨佔的,它必須解除對共享資源的鎖定的狀態,通知其他執行緒可以使用該...

執行緒間通訊 生產者消費者實踐

簡單生產者消費者問題 現有兩個執行緒a b,對乙個初始值未零的數加減一的操作,不能為負數,二者必須要實現輪流操作 操作十次 就在前不久自己也遇到了乙個這樣的問題,但是沒有考慮到的是執行緒的通訊,利用迴圈完成的輪流執行,唉 慘,不多說了重新來!再一次 高內聚低耦合前提下實現執行緒操作資源類!資源類 c...

執行緒 執行緒間通訊(生產者消費者模式)

注意 1.執行緒間的通訊,共享的資料一定要有同步 塊synchronized 2.一定要有wait和notify,而且二者一定是成對出現 3.生產者和消費者的執行緒實現一定是在while true 裡面public class basket public void setempty boolean ...