Linux多執行緒 生產者消費者

2021-06-07 17:18:30 字數 1708 閱讀 8129

生產者消費者問題

這是乙個非常經典的多執行緒題目,題目大意如下:有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不允許消費者到乙個空的緩衝區中取產品,也不允許生產者向乙個已經裝滿產品且尚未被取走的緩衝區中投放產品。

程式:

// producer_consumer.cpp

//// 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,

// 在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩

// 沖區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不允許消

// 費者到乙個空的緩衝區中取產品,也不允許生產者向乙個已經裝滿產品且尚未被取走的緩衝區中投放產品。

//#include #include #include #include const int buffer_length = 100;

int buffer[buffer_length];

int front = 0, rear = -1; // 緩衝區的前端和尾端

int size = 0;

pthread_mutex_t mutex = pthread_mutex_initializer;

pthread_cond_t empty_cond = pthread_cond_initializer;

pthread_cond_t full_cond = pthread_cond_initializer;

bool producer_wait = false;

bool consumer_wait = false;

void *producer(void *arg);

void *consumer(void *arg);

int main(int argc, char **argv)

void *producer(void *arg)

// 往尾端新增乙個產品

rear = (rear + 1) % buffer_length;

buffer[rear] = rand() % buffer_length;

printf("producer produces the item %d: %d\n", rear, buffer[rear]);

++size;

if (size == 1) // 如果當前size=1, 說明以前size=0, 消費者在等待,則給消費者發訊號}}

pthread_mutex_unlock(&mutex);

}}void *consumer(void *arg)

// 從前端消費乙個產品

printf("consumer consumes an item%d: %d\n", front, buffer[front]);

front = (front + 1) % buffer_length;

--size;

if (size == buffer_length-1) // 如果當前size=buffer_length-1,說明以前生產者在等待,則給生產者發訊號}}

pthread_mutex_unlock(&mutex);

}}

多執行緒 生產者消費者

這個就不多說了,直接上 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 寫資料,並...

linux多執行緒實現生產者消費者

1.初始化 條件變數採用的資料型別是pthread cond t,在使用之前必須要進行初始化,這包括兩種方式 include include include 條件變數生產者和消費者 pthread cond t condc,condp pthread mutex t the mutex unsign...