多線程併發應用程序有一個經典的模型,即生產者/消費者模型。系統中,產生消息的是生產者,處理消息的是消費者,消費者和生產者經過一個緩衝區進行消息傳遞。生產者產生消息後提交到緩衝區,而後通知消費者能夠從中取出消息進行處理。消費者處理完信息後,通知生產者能夠繼續提供消息。多線程
要實現這個模型,關鍵在於消費者和生產者這兩個線程進行同步。也就是說:只有緩衝區中有消息時,消費者纔可以提取消息;只有消息已被處理,生產者才能產生消息提交到緩衝區。併發
咱們用一個隊列來作這個緩衝區,產生的消息咱們放到這個隊列中去,若是這個隊列滿了,則不放入消息,咱們這個隊列大小是10,可以存放10條消息。而後消費者去消費,消費者去這個緩衝區裏去取數據,一樣,若是緩衝區裏沒有數據,那麼就不會消費。線程
這一模型的核心就是消費者和生產者一塊兒去搶互斥鎖,誰搶到了這個鎖誰就有資格對這個緩衝區進行相關操做。blog
分析隊列
一線程負責生產數據,另外一部分線程負責消費數據。get
問題1:若是產生的塊,消費的慢,生產者容易餓死同步
問題2:若是生產的慢,消費的快,消費者容易餓死it
只有把兩個問題協調好,才能最大限度的提升效率。io
代碼:thread
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define MAX 20
char storage[MAX] = {};
int count = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t full = PTHREAD_COND_INITIALIZER;
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
void show_storage(char* role,char* op,char prod)
{
printf("%s:",role);
for(int i=0; i<count; i++)
{
printf("%c",storage[i]);
}
printf("%s%c\n",op,prod);
}
void* pro_run(void* arg)
{
char* who = "生產者";
while(1)
{
pthread_mutex_lock(&mutex);
while(count >= MAX)
{
printf("%s:滿倉\n",who);
pthread_cond_wait(&full,&mutex);
}
char prod = 'A'+rand()%26;
storage[count++] = prod;
show_storage(who,"->",prod);
pthread_cond_signal(&empty);
pthread_mutex_unlock(&mutex);
usleep(rand()%100*1000);
}
}
void* con_run(void* arg)
{
char* who = "消費者";
while(1)
{
pthread_mutex_lock(&mutex);
while(count <= 0)
{
printf("%s:空倉\n",who);
pthread_cond_wait(&empty,&mutex);
}
char prod = storage[count--];
show_storage(who,"<-",prod);
pthread_cond_signal(&full);
pthread_mutex_unlock(&mutex);
usleep(rand()%100*1000);
}
}
int main()
{
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,pro_run,NULL);
pthread_create(&tid2,NULL,con_run,NULL);
getchar();
}
實現: