条件变量 ╰+攻爆jí腚メ 2022-12-12 15:05 213阅读 0赞 三、条件变量。 1、 什么是条件变量? 线程因为某一个条件/情况不成立下,进入一个变量中等待,这个存放线程的变量就是条件变量。 条件变量一定要与互斥锁连用。 2、条件变量的函数接口。 1)先定义一个条件变量。 -> 数据类型: pthread\_cond\_t pthread\_cond\_t cond; 2)初始化条件变量。 -> pthread\_cond\_init() -> man 3 pthread\_cond\_init 动态初始化: 头文件: \#include <pthread.h> 原型: int pthread\_cond\_init(pthread\_cond\_t \*cond, pthread\_condattr\_t \*cond\_attr); 参数: cond: 条件变量的地址。 cond\_attr: 普通属性,填NULL。 返回值: 成功:0 失败:非0 静态初始化: pthread\_cond\_t cond = PTHREAD\_COND\_INITIALIZER; 3)如何进入条件变量中等待? -> pthread\_cond\_wait() -> man 3 pthread\_cond\_wait 头文件: \#include <pthread.h> 原型: int pthread\_cond\_wait(pthread\_cond\_t \*cond, pthread\_mutex\_t \*mutex); 参数: cond:条件变量的地址。 mutex: 互斥锁的地址。 -> 进入条件变量中等待时,会自动解锁。 返回值: 成功:0 失败:非0 4)如何唤醒条件变量中等待的线程? -> 线程离开条件变量时,会自动上锁。 广播:唤醒所有在条件变量中等待的线程。 --> pthread\_cond\_broadcast() 单播:随机唤醒一个在条件变量中等待的线程。 --> pthread\_cond\_signal() 头文件: \#include <pthread.h> 原型: int pthread\_cond\_broadcast(pthread\_cond\_t \*cond); int pthread\_cond\_signal(pthread\_cond\_t \*cond); 参数: cond:条件变量的地址。 返回值: 成功:0 失败:非0 5)销毁条件变量。 -> pthread\_cond\_destroy() -> man 3 pthread\_cond\_destroy 头文件: \#include <pthread.h> 原型: int pthread\_cond\_destroy(pthread\_cond\_t \*cond); 参数: cond:条件变量的地址。 返回值: 成功:0 失败:非0 练习4: 有5个小孩,每一个小孩任务都是拿200块,首先在银行卡里面存400块,有2个小孩可以拿到钱后退出,3个线程拿不到钱就进去条件变量中睡眠,5S再打400块之后,唤醒所有的小孩起来拿钱,4S再打200块,唤醒一个小孩起来。 \#include "head.h" //初始化互斥锁 pthread\_mutex\_t m = PTHREAD\_MUTEX\_INITIALIZER; //初始化条件变量 pthread\_cond\_t cond = PTHREAD\_COND\_INITIALIZER; int sum = 400; //线程: void \*fun(void \*arg) \{ //1. 每一个线程访问临界资源(银行卡)之前,都必须先上锁。 pthread\_mutex\_lock(&m); //2. 询问条件是否满足? while(sum < 200) //请问余额是不是<200 \{ //3. 不能拿到钱就进去睡眠。 pthread\_cond\_wait(&cond,&m); \} //4. 能拿到钱就扣钱 printf("before money:%d\\n",sum); sum -= 200; printf("after money:%d\\n",sum); //5. 解锁 pthread\_mutex\_unlock(&m); //6. 走人 pthread\_exit(NULL); \} void \*func\_time(void \*arg) \{ int i; for(i=0;i<100;i++) \{ printf("i = %d\\n",i); sleep(1); \} \} int main(int argc,char \*argv\[\]) \{ //0. 倒数时间线程 pthread\_t tid\_time; pthread\_create(&tid\_time,NULL,func\_time,NULL); //1. 由于5个线程任务一样,通过循环去创建线程。 int i; pthread\_t tid\[5\]; for(i=0;i<5;i++) \{ pthread\_create(&tid\[i\],NULL,fun,NULL); \} //2. 打400块 sleep(5); pthread\_mutex\_lock(&m); sum += 400; printf("main thread + 400!\\n"); pthread\_mutex\_unlock(&m); //3. 唤醒所有小孩 sleep(2); pthread\_cond\_broadcast(&cond); //只有2个小孩能拿到钱 //4. 打200块 sleep(3); pthread\_mutex\_lock(&m); sum += 200; printf("main thread + 200!\\n"); pthread\_mutex\_unlock(&m); //5. 唤醒一个小孩 sleep(2); pthread\_cond\_signal(&cond); //6. 接合线程 for(i=0;i<5;i++) \{ pthread\_join(tid\[i\],NULL); \} //7. 销毁资源 pthread\_mutex\_destroy(&m); pthread\_cond\_destroy(&cond); return 0; \}
还没有评论,来说两句吧...