成電linux課程作業,多執行緒生產者消費者問題

2021-10-25 08:50:35 字數 2437 閱讀 3224

問題描述如圖:

生產者消費者使用管道進行通訊,每次讀寫1024*sizeof(int)大小的資料。

int fd[10][2];//管道陣列

int fd_empty[10]=;//消費者執行緒判斷管道是否為空陣列

生產者要判斷管道是否為空,消費者要判斷管道內是否含有資料,因此追加宣告乙個fd_empty陣列來讓生產者消費者執行緒判斷。

由於只有乙個生產者,所以生產的時候是順序生產的,即檔案中的資料塊為1,2,3,4…。為了生產效率,生產時會遍歷管道,尋找到為空的管道將資料填入其中,消費者消費時,會遍歷管道,尋找到不為空的管道進行消費。由於生產者生產時填入管道中的資料為亂序,比如1號管道中的資料塊可能為1,2,8。而消費者消費時讀取到的資料塊也無先後順序,比如先讀取到了2號資料塊,再讀取到1號資料塊,此時如果像生產者那樣順序寫入檔案的話,得到的結果肯定和生產者生產的結果不一樣。所以我們需要得到生產者生產的資料塊所對應的位置資訊。所以我們將fd_empty中儲存位置資訊,比如生產者第n次生產的資料塊放入第m個管道中,那麼fd_empty[m]=n,消費者可以據此知悉自己所讀的資料塊的位置是在**。

最後用

pwrite(fp,w, once_number* sizeof(int), location*4096);
將資料塊寫入指定的位置

#include#include#include#include#include#include #include#includeint fd[10][2];//管道陣列

int fd_empty[10]=;//消費者執行緒判斷管道是否為空陣列

int pthread_number=10;//消費者數量

int once_number=1024;//一次讀寫大小

int all_ready_read=0;//目前消費者消費次數

int loop_number=262144;//生產(消費)次數

pthread_mutex_t mutex_fd_empty = pthread_mutex_initializer;//給fd_empty陣列上鎖

void *producer()

{

int i=0;

int *fp;

int fd_number=0;//

int flag=0;//判斷是否有管道空閒flag

用md5和diff判斷檔案內容相同

1.首先是在檔案讀寫方面

fp=open("/home/wsk/文件/linuxhomework2/data2.txt",o_rdwr |o_creat,s_irwxu))

這裡在最後加上了s_irwxu,是為了給檔案所有許可權,不然建立出來的檔案是上鎖的狀態(唯讀或者不可讀不可寫),不能進行後續的操作。

2.記憶體分配

每次寫入讀出都是1024位元組,這裡使用了動態分配即:malloc

int *w = (int *)malloc(once_number* sizeof(int));
如果是宣告命名w[1024]也可以。但是直接宣告w[1024]是在棧內分配的記憶體,而用malloc是在堆上分配的記憶體。棧上分配記憶體存在著乙個上限,而堆上分配記憶體的上限比棧上分配高。

3.關於上鎖

由於生產者生產完的產品放在管道中供消費者去品嚐,所以二者都要對fd_empty陣列進行操作(生產者生產完了裡面放位置資訊,消費者消費結束後放0)。因此要對這個共享陣列進行上鎖。

此外由於消費者執行緒有10個,他們之間也是並行的,所以消費者們會存在對管道的爭奪:比如現在有乙個管道內含有資料,因為程式寫的是先消費再置0,所以有可能乙個消費者正在消費的時候,將其切出,另乙個消費者獲得了同樣的管道介面,結果等第二個消費者想消費的時候管道裡早已空無一物(被第乙個消費者消費掉了)。因此為了避免這個問題將消費過程整體上鎖。

關於為什麼不讀出管道後馬上置0,讓其他消費者知道該管道被讀取了:

因為生產者和消費者也是並行的,可能存在消費者置0後還沒來得及讀,生產者以為管道內空無一物了,將其中的資料覆蓋掉,所以要等消費完成後再進行置0。

Linux多執行緒 生產者消費者

生產者消費者問題 這是乙個非常經典的多執行緒題目,題目大意如下 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步...

多執行緒 生產者消費者

這個就不多說了,直接上 include include using namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short consumeid 0...

linux多執行緒 生產者消費者問題

include include define buffer size 8 struct prodcons 初始化緩衝區結構 void init struct prodcons b 將產品放入緩衝區,這裡是存入乙個整數 void put struct prodcons b,int data 寫資料,並...