#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
struct msg
{
struct msg *next;
int num;
};
struct msg *head;
pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void *consumer(void *p)
{
struct msg *mp;
while(1)
{
pthread_mutex_lock(&lock); //1 : 消费者先加锁
printf("consumer is lock.\n");
while(NULL == head)
{
pthread_cond_wait(&has_product,&lock); //2: 消费者循环等待
}
mp = head;
head = mp->next;
pthread_mutex_unlock(&lock); //3:消费者释放锁
printf("consumer is unlock.\n");
printf("Consume %d\n",mp->num);
free(mp);
sleep(rand() % 5);
}
}
void *producer(void *p)
{
struct msg *mp;
while(1)
{
mp = malloc(sizeof(struct msg));
mp->num = rand() % 1000 + 1;
printf("Produce %d\n",mp->num);
pthread_mutex_lock(&lock); //4:生产者加锁,但此时消费者并未释放锁,但此处却加锁成功了???
printf("producer is lock.\n");
mp->next = head;
head = mp;
pthread_mutex_unlock(&lock); //5:生产者释放锁
printf("producer is unlock.\n");
pthread_cond_signal(&has_product);
sleep(rand() % 5);
}
}
int main(int argc, char *argv[])
{
pthread_t pid,cid;
srand(time(NULL));
pthread_create(&cid,NULL,consumer,NULL); //6:让消费者先运行,加锁,然后进入循环等待状态
sleep(3);
pthread_create(&pid,NULL,producer,NULL);
pthread_join(pid,NULL);
pthread_join(cid,NULL);
return 0;
}
测试输出:
consumer is lock. //此处已经加锁
Produce 728
producer is lock. //此处锁并未释放,但却获得了锁,为什么呢???
producer is unlock.
consumer is unlock.
Consume 728
Produce 630
producer is lock.
producer is unlock.
consumer is lock.
consumer is unlock.
Consume 630
consumer is lock.
慕容708150
相关分类