用消费者生产者模型说明Linux多线程编程
//作用:阻塞并等待某处用函数pthread_cond_signal()发送信号
pthread_cond_wait(&cond, &lock);
//1.进入函数(这时的互斥量已经被锁住)
//2.等待条件
//3.解锁互斥量
//4.等待条件
//5.锁住互斥量
//6.函数返回(这时的互斥量还是被锁住)
//
//说明:
//1.在第2步就开始等待,是为了防止条件改变发生在第3步和第4步之间,防止遗漏任何的条件改变
//2.在进入函数时就锁住互斥量,保护了条件变量,防止条件变量在调用函数pthread_cond_wait()之前就改变
//3.函数pthread_cond_wait()放在while()循环中,可防止当该函数返回时,被互斥量保护的普通变量goods仍不满足条件
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define MAX 20
pthread_mutex_t lock;
pthread_cond_t cond;
int goods = 0;
void *ThrPro(void *ptr)
{
sleep(5);//休眠5s
int i;
for(i = 0; i < MAX; i++) {
pthread_mutex_lock(&lock);
while(goods != 0)
pthread_cond_wait(&cond, &lock);
printf("pro add, i:%d, goods:%d
", i, goods);
goods++;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
}
pthread_exit(0);
}
void *ThrCon(void *ptr)
{
int i;
for(i = 0; i < MAX; i++) {
pthread_mutex_lock(&lock);
while(goods == 0)
pthread_cond_wait(&cond, &lock);
printf("con min, i:%d, goods:%d
", i, goods);
goods--;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&lock);
}
pthread_exit(0);
}
int main()
{
pthread_t pro, con;
pthread_mutex_init(&lock, 0);//初始化互斥量lock
pthread_cond_init(&cond, 0);//初始化条件变量
pthread_create(&pro, 0, ThrPro, 0);//创建线程pro,从函数ThrPro处运行
pthread_create(&con, 0, ThrCon, 0);//创建线程con,从函数ThrCon处运行
pthread_join(pro, 0);//阻塞,以等待线程pro结束
pthread_join(con, 0);//阻塞,以等待线程con结束
pthread_mutex_destroy(&lock);//释放互斥量lock
pthread_cond_destroy(&cond);//释放条件变量cond
return 0;
}