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;
}