#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.
30秒到达战场
慕容708150
随时随地看视频慕课网APP
相关分类