怎樣用C++實現生產者消費者的模擬?

似乎要使用Linux的API?


// 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 cond = PTHREAD_COND_INITIALIZER;

void *producer(void *arg);
void *consumer(void *arg);

int main(int argc, char **argv)
{
pthread_t producer_id;
pthread_t consumer_id;

pthread_create(producer_id, NULL, producer, NULL);

pthread_create(consumer_id, NULL, consumer, NULL);

//主線程運行結束,子線程也就運行結束了
//http://bbs.chinaunix.net/thread-1286290-1-1.html
sleep(1);

return 0;
}

void *producer(void *arg)
{
//pthread_detach(threadid)函數的功能是使線程ID為threadid的線程處於分離狀態,一旦線程處於分離狀態,
//該線程終止時底 層資源立即被回收;否則終止子線程的狀態會一直保存(佔用系統資源)直到主線程調用pthread_join(threadid,NULL)獲取線程的退 出狀態。
//通常是主線程使用pthread_create()創建子線程以後,一般可以調用pthread_detach(threadid)分離剛剛創建的子線程,

//這裡的threadid是指子線程的threadid;如此以來,該子線程止時底層資源立即被回收;
//被創建的子線程也可以自己分離自己,子線程調用pthread_detach(pthread_self())就是分離自己,
//因為pthread_self()這個函數返回的就是自己本身的線程ID;
pthread_detach(pthread_self());

while (true)
{
pthread_mutex_lock(mutex);
while (size == BUFFER_LENGTH) // 如果緩衝區已滿,等待; 否則,添加新產品
{
printf("buffer is full. producer is waiting...
");
pthread_cond_wait(cond, mutex);
}
// 往尾端添加一個產品
rear = (rear + 1) % BUFFER_LENGTH;
buffer[rear] = rand() % BUFFER_LENGTH;
printf("producer produces the item %d: %d
", rear, buffer[rear]);
++size;
if (size == 1) // 如果當前size=1, 說明以前size=0, 消費者在等待,則給消費者發信號
{
pthread_cond_signal(cond);
}
pthread_mutex_unlock(mutex);
}
}

void *consumer(void *arg)
{
pthread_detach(pthread_self());

while (true)
{
pthread_mutex_lock(mutex);
while(size == 0) // 如果緩衝區已空,等待; 否則,消費產品
{
printf("buffer is empty. consumer is waiting...
");
pthread_cond_wait(cond, mutex);
}
// 從前端消費一個產品
printf("consumer consumes an item%d: %d
", front, buffer[front]);
front = (front + 1) % BUFFER_LENGTH;
--size;
if (size == BUFFER_LENGTH-1) // 如果當前size=BUFFER_LENGTH-1,說明以前生產者在等待,則給生產者發信號
{
pthread_cond_signal(cond);
}
pthread_mutex_unlock(mutex);
}
}


用個鎖(api或標準庫都行)建一個blocking queue就行了。沒電碼代碼了


就目前C++11來看,這個已經可以跨平台實現了。可以使用線程標準庫。

可能要用到這三個頭文件:&, &, &

然後你參考各種非跨平台的實現,做一把轉換就可以了。比方說pthread相關的可以用std::thread來取代。


推薦閱讀:

C++向上轉型,為什麼不需要強制轉換?
有沒有一本書,專門講各種UI效果怎麼實現的,而不是講各種庫的使用辦法的?
打字速度對編程的影響大嗎?
為什麼同為系統級編程語言,Rust 能擁有現代構建/包管理工具,C++ 卻不能?
為什麼C++調用空指針對象的成員函數可以運行通過?

TAG:Linux | C | 並發 | 線程安全 | 生產者消費者問題 |