生產者消費者問題的pthread模擬

2021-09-30 14:21:28 字數 2600 閱讀 3492

作業系統概念第七版上第六章的專案「生產者-消費者問題」的解答。

採用了三個訊號量:empty(記錄多少個空位),full(記錄有多少滿位)以及mutex(二進位制訊號量以保護對緩衝的插入與刪除操作)。

buffer.h標頭檔案宣告了緩衝區資料型別,緩衝大小,以及對緩衝區可採取的操作。

/*buffer.h*/

typedef int buffer_item;

#define buffer_size 5

int insert_item(buffer_item);

int remove_item(buffer_item *);

void printbuffer();

buffer.c為緩衝區插入,刪除以及列印操作的具體實現。

/*buffer.c*/

#include

#include "buffer.h"

static buffer_item buffer[buffer_size];

static

int counter, in, out;

int insert_item(buffer_item item) else

}int remove_item(buffer_item *item) else

}void printbuffer()

printf("end\n");

}

mutex.h標頭檔案宣告了使用的訊號量。

/*mutex.h*/

#include

#include

pthread_mutex_t mutex;

sem_t empty, full;

thread.h宣告了生產者程序和消費者程序。

/*thread.h*/

void *producer(void* param);

void *consumer(void* param);

thread.c為生產者程序和消費者程序的具體實現。在臨界區內對緩衝分別進行插入與移出操作,並在螢幕上顯示緩衝區內容。

/*thread.c*/

#include

#include

#include

#include

#include

#include "mutex.h"

#include "threads.h"

#include "buffer.h"

void *producer(void* param)

printf("%lu producer insert item %2d success. current buffer is:", pthread_self(), item);

printbuffer();

//end

//exit section

pthread_mutex_unlock(&mutex);

sem_post(&full);

//end

//remainder section

//end

}}void *consumer(void* param)

printf("%lu consumer remove item %2d success. current buffer is:", pthread_self(), item);

printbuffer();

//end

//exit section

pthread_mutex_unlock(&mutex);

sem_post(&empty);

//end

//remainder section

//end

}}

main.c為主函式實現,內容如下:

/*main.c*/

#include

#include

#include

#include

#include

#include "mutex.h"

#include "threads.h"

#include "buffer.h"

int main(int argc, char

const *ar**)

if (atoi(ar**[1]) <= 0)

if (atoi(ar**[2]) <= 0)

if (atoi(ar**[3]) <= 0)

pthread_mutex_init(&mutex, null);

sem_init(&empty, 0, buffer_size);

sem_init(&full, 0, 0);

producer threads

for (int i = 0; i < atoi(ar**[2]); ++i)

consumer threads

for (int i = 0; i < atoi(ar**[3]); ++i)

sleep(atoi(ar**[1]));

exit(0);

}

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...

生產者 消費者問題

1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...