Linux多线程编程
用消费者生产者模型说明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\n", 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\n", 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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步