linux条件变量
2016-04-25 15:15
363 查看
条件变量用于线程之间的通信,和互斥锁一起使用。条件变量用于及时通知等待的线程条件的变化,使线程不至于错过变化。
考虑下面的情况,有AB两个线程对index这个全局变量进行++,一个线程C用于判断,index是不是3的倍数,如果是就输出除以3的结果。
根据时间片轮转的算法,线程应该是这样执行的。
Index初值为1.
A B C (此时index=3,输出)A B C(此时index=5,不输出) A(此时index=6,c还在队列的最后,错过)BC 。。。。
我们能看出,C会每隔一段时间就错个一个。
如图:
因为三个线程的优先级一样,不存在抢占,而且CPU是把时间片分给每个线程的,所以C的错过是必然的。
所以引入了条件变量。
C线程调用pthread_cond_wait(cond,lock)函数来感知变化。
代码:
考虑下面的情况,有AB两个线程对index这个全局变量进行++,一个线程C用于判断,index是不是3的倍数,如果是就输出除以3的结果。
根据时间片轮转的算法,线程应该是这样执行的。
Index初值为1.
A B C (此时index=3,输出)A B C(此时index=5,不输出) A(此时index=6,c还在队列的最后,错过)BC 。。。。
我们能看出,C会每隔一段时间就错个一个。
如图:
因为三个线程的优先级一样,不存在抢占,而且CPU是把时间片分给每个线程的,所以C的错过是必然的。
所以引入了条件变量。
C线程调用pthread_cond_wait(cond,lock)函数来感知变化。
代码:
#include <pthread.h> #include <semaphore.h> #include <unistd.h> #include <stdio.h> #include<fcntl.h> #include <pthread.h> #include <errno.h> int index = 1; pthread_mutex_t lock; pthread_cond_t cond; void fun1(void){ while(index<50){ pthread_mutex_lock(&lock); index++; printf("In fun1 : %d\n",index); pthread_cond_signal(&cond);//当有变化后,使用signal通知wait函数 pthread_mutex_unlock(&lock); usleep(0.1); } } void fun3(void){ while(index<50){ pthread_mutex_lock(&lock); index++; printf("In fun1 : %d\n",index); pthread_cond_signal(&cond); pthread_mutex_unlock(&lock); usleep(0.1); } } void fun2(void){ int i=0; while(i<70){ pthread_mutex_lock(&lock); while(index%3!=0){ pthread_cond_wait(&cond,&lock);//如果获得了互斥锁,但是条件不合适的话,wait会释放锁,不往下执行。当变化后,条件合适,将直接获得锁。 } //if(index%3==0) printf("%d\n",index/3); //else //printf("no\n"); i++; pthread_mutex_unlock(&lock); usleep(0.1); } } int main(){ pthread_mutex_init(&lock,NULL); pthread_cond_init(&cond,NULL); pthread_t tid1,tid2,tid3; pthread_create(&tid1,NULL,(void*)fun1,NULL); pthread_create(&tid2,NULL,(void*)fun2,NULL); pthread_create(&tid3,NULL,(void*)fun3,NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); pthread_join(tid3,NULL); }
相关文章推荐
- Centos 清理内存
- 永久关闭linux防火墙
- linux下使用select实现精确定时器
- arm-linux-gcc 交叉编译工具链安装
- Linux文件和目录管理常用重要命令
- 安装linux操作系统--浪潮服务器
- 安装linux操作系统--浪潮服务器
- 安装linux操作系统--浪潮服务器
- Linux系统下adb devices无法看到移动设备
- 使用pscp上传文件到linux系统
- linux安装fprot扫描病毒
- Linux_Centos如何设置IP地址,LINUX怎么修改IP地址
- Centos7 SSH密钥登陆及密码密钥双重验证
- CentOS6.7安装gcc-前需要安装其它包
- vmware 中linux虚拟机动态添加硬盘
- Linux 系统裁剪笔记 4 (内核配置选项及删改)
- Linux 系统裁剪笔记 4 (内核配置选项及删改)
- Linux 系统裁剪笔记 4 (内核配置选项及删改)
- linux知识
- Linux 系统裁剪笔记 4 (内核配置选项及删改)