条件变量pthread_cond_t怎么用
LINUX系统编程这一快的知识,如果不经常使用的话,可能也会忘记,在项目中,可以代码可以看懂,但是自己亲自写的话,可能还是要翻一下<Linux 环境高级编程>这本书比较好,下面就简单记一下这个知识点
一般pthread_cond_t,会搭配pthread_mutex_t 一起使用的, 因为线程间通信时操作共享内存时,需要用到锁。当锁住的共享变量发生改变时,可能需要通知相应的线程(因为可能该共享变量涉及到多个线程),这时就需要用到pthread_cond_t这种条件变量来精准的通知某个或几个线程, 让他们执行相应的操作
pthread_cond_t涉及两个函数,一个是pthread_cond_signal函数,它在一个线程中,用来发送信号。一个是pthread_cond_wait函数,他在另一个线程中,用来接收信号。当线程执行到pthread_cond_wait函数时,他会释放相应的锁,让其他线程获得锁继续执行,这样其他线程才有机会给他发信号;当它接收到信号时,会重新去获得锁,如果没有获得锁,就阻塞等待,直到获得锁,才执行接收信号的相应操作。
废话这么多,直接上代码例子
- #include <pthread.h>
- #include <stdio.h>
- #include <stdlib.h>
- pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;/*初始化互斥锁*/
- pthread_cond_t cond = PTHREAD_COND_INITIALIZER;/*初始化条件变量*/
- void *thread1(void *);
- void *thread2(void *);
- int i=1;
- int main(void)
- {
- pthread_t t_a;
- pthread_t t_b;
- pthread_create(&t_a,NULL,thread1,(void *)NULL);/*创建进程t_a*/
- pthread_create(&t_b,NULL,thread2,(void *)NULL); /*创建进程t_b*/
- pthread_join(t_a, NULL);/*等待进程t_a结束*/
- pthread_join(t_b, NULL);/*等待进程t_b结束*/
- pthread_mutex_destroy(&mutex);
- pthread_cond_destroy(&cond);
- exit(0);
- }
- void *thread1(void *junk)
- {
- for(i=1;i<=6;i++)
- {
- pthread_mutex_lock(&mutex);/*锁住互斥量*/
- printf("thread1: lock %d/n", __LINE__);
- if(i%3==0){
- printf("thread1:signal 1 %d/n", __LINE__);
- pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/
- printf("thread1:signal 2 %d/n", __LINE__);
- sleep(1);
- }
- pthread_mutex_unlock(&mutex);/*解锁互斥量*/
- printf("thread1: unlock %d/n/n", __LINE__);
- sleep(1);
- }
- }
- void *thread2(void *junk)
- {
- while(i<6)
- {
- pthread_mutex_lock(&mutex);
- printf("thread2: lock %d/n", __LINE__);
- if(i%3!=0){
- printf("thread2: wait 1 %d/n", __LINE__);
- pthread_cond_wait(&cond,&mutex);/*解锁mutex,并等待cond改变*/
- printf("thread2: wait 2 %d/n", __LINE__);
- }
- pthread_mutex_unlock(&mutex);
- printf("thread2: unlock %d/n/n", __LINE__);
- sleep(1);
- }
- }
编译:
[X61@horizon threads]$ gcc thread_cond.c -lpthread -o tcd
以下是程序运行结果:
[X61@horizon threads]$ ./tcd
thread1: lock 30
thread1: unlock 40
thread2: lock 52
thread2: wait 1 55
thread1: lock 30
thread1: unlock 40
thread1: lock 30
thread1:signal 1 33
thread1:signal 2 35
thread1: unlock 40
thread2: wait 2 57
thread2: unlock 61
thread1: lock 30
thread1: unlock 40
thread2: lock 52
thread2: wait 1 55
thread1: lock 30
thread1: unlock 40
thread1: lock 30
thread1:signal 1 33
thread1:signal 2 35
thread1: unlock 40
thread2: wait 2 57
thread2: unlock 61
这里的两个关键函数就在pthread_cond_wait和pthread_cond_signal函数。
本例中:
线程一先执行,获得mutex锁,打印,然后释放mutex锁,然后阻塞自己1秒。
线程二此时和线程一应该是并发的执行 ,这里是一个要点,为什么说是线程此时是并发的执行,因为此时不做任何干涉的话,是没有办法确定是线程一先获得执行还是线程二先获得执行,到底那个线程先获得执行,取决于操作系统的调度,想刻意的让线程2先执行,可以让线程2一出来,先sleep一秒。
这里并发执行的情况是,线程一先进入循环,然后获得锁,此时估计线程二执行,阻塞在
pthread_mutex_lock(&mutex);
这行语句中,直到线程1释放mutex锁
pthread_mutex_unlock(&mutex);/*解锁互斥量*/
然后线程二得已执行,获取metux锁,满足if条件,到pthread_cond_wait (&cond,&mutex);/*等待*/
这里的线程二阻塞,不仅仅是等待cond变量发生改变,同时释放mutex锁 ,因为当时看书没有注意,所以这里卡了很久。
mutex锁释放后,线程1终于获得了mutex锁,得已继续运行,当线程1的if(i%3==0)的条件满足后,通过pthread_cond_signal发送信号,告诉等待cond的变量的线程(这个情景中是线程二),cond条件变量已经发生了改变。
不过此时线程二并没有立即得到运行 ,因为线程二还在等待mutex锁的释放,所以线程一继续往下走,直到线程一释放mutex锁,线程二才能停止等待,打印语句,然后往下走通过pthread_mutex_unlock(&mutex)释放mutex锁,进入下一个循环。
转自:http://blog.csdn.net/zclongembedded/article/details/7337729
条件变量pthread_cond_t怎么用相关推荐
- Linux多线程开发-线程同步-条件变量pthread_cond_t
1.条件变量的概念 一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待.线程B可以产生线程A继续执行的信号.条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题.POSIX线程库提供了 ...
- Linux操作系统下的多线程编程详细解析----条件变量pthread_cond_t那些事儿
推荐两个博文: http://www.cnblogs.com/Creator/archive/2012/04/18/2455584.html http://blog.csdn.net/sunboy_2 ...
- POSIX多线程编程-条件变量pthread_cond_t
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用.使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化.一旦其它 ...
- phtread条件变量pthread_cond_t初始化方式
1.静态方式 初始化方法: int x,y; pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREA ...
- java线程条件变量_多线程同步条件变量(转载)
最近看<UNIX环境高级编程>多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白 #include #include ...
- linux多进程条件变量,Linux 多线程条件变量同步
条件变量是线程同步的另一种方式,实际上,条件变量是信号量的底层实现,这也就意味着,使用条件变量可以拥有更大的自由度,同时也就需要更加小心的进行同步操作.条件变量使用的条件本身是需要使用互斥量进行保护的 ...
- c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
- 3线程同步:条件变量
1条件变量 条件变量给多个线程提供了一个汇合的场所. 依赖的头文件 #include<pthread.h> 函数声明 定义分配条件变量 pthread_cond_t cond =PTHRE ...
- 判断sem信号量为零_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...
为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...
最新文章
- “分布式哈希”和“一致性哈希”的概念与算法实现
- 【Linux】内核态和用户态
- Spring事务的处理流程、传播属性、及部分释疑
- 南京工程学院 嵌入式linux 复习
- 内核版常见问题和精华贴总结(VER 0.1) [
- 2021 年 JavaScript 大事记
- Java 批量插入数据到数据库(MySQL)中
- 为什么全天坐在电脑前会让你精疲力竭
- ups一直响是什么原因_UPS的完整形式是什么?
- mysql管理命令 java_Mysql常用命令及操作
- 大数据在各行业中的应用表现
- 一个典型的Prototype 示例代码
- android单点触摸事件,Android多点触控详解
- 云原生、工业互联网之浅见
- 求余数(c++基础)
- oracle如何新建用户
- 12G大显存,七彩虹在CES发布多款RTX 3060显卡和游戏整机新品
- 局域网匿名访问共享文件的设置方法?
- 有符号二进制数的减法
- 【转载】如何学习STM32?STM32入门学习经验总结