1.生产者—消费者模型的321原则
生产者-生产者 互斥
消费者-消费者 互斥
生产者-消费者 互斥,同步
typedef struct _head //结构体声明 { int data; struct _head *next; }Node,*Node_p,**Node_pp; Node_p head; //头指针声明 void InitList(Node_pp _h) //初始化带头节点链表 { *_h =(Node_p)malloc(sizeof(Node)); (*_h)->next = NULL; } void PushFrond(Node_p _h,int K)// { Node_p tmp = _h->next; _h->next =(Node_p)malloc(sizeof(Node)); _h = _h->next; _h->data = K; _h->next = tmp; } Node_p PopFrond(Node_p _h) { if(_h->next == NULL) return NULL; Node_p tail = _h->next; _h->next = tail->next; return tail; }
void *consume(void *arg) // 用于消费,即调用PopFrond
void &product(void *arg) //用于生产,即调用PushFrond
pthread_mutex_t mutex_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex_lock);//加锁
pthread_mutex_unlock(&mutex_lock);//解锁
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_cond_wait(&cond,&mutex_lock);//等待
pthread_cond_signal(&cond);//发信号
void* product(void *arg) { while(1){ int n = rand()/12123; pthread_mutex_lock(&mutex_lock); //解锁访问 PushFrond(head,n); printf("product done! %d\n",n); pthread_mutex_unlock(&mutex_lock);//解锁 pthread_cond_signal(&cond);//生产完成,发送信号,消费者消费 sleep(2); } return NULL; } void *consum(void *arg) { while(1){ pthread_mutex_lock(&mutex_lock);//加锁访问 Node_p tmp = PopFrond(head); while(tmp == NULL)//当没有资源时,则阻塞等待 { pthread_cond_wait(&cond, &mutex_lock); tmp = PopFrond(head); } printf("consum done! %d\n",tmp->data); pthread_mutex_unlock(&mutex_lock);//解锁 } return NULL; }