boost线程同步(2)——条件变量(POSIX)
2016-06-02 23:30
281 查看
boost是一个优秀的跨平台c++库,既然是跨平台那么它肯定封装了许多与具体的操作系统相关的内容。比如,windows和linux在文件系统、线程操作等等上有许多的不同之处,而boost封装了其中的差异,以一种统一的方便用户操作的形式展现出来。
简单易用是一方面,还有一方面是boost既支持原有操作系统的功能,又在其上进行了扩展,使C++变得更加强大。
今天我们谈谈boost对条件变量的支持。首先,先说说条件变量是干什么的。FOR EFFICIENCY!为了效率!
其实世界上大部分东西的发明都是为了能够更快的干某一件事情。比如飞机,比如火箭。其实没有飞机,我们可以多走几天,几个月一样可以到达目的地。但是,如果都有这种思想,无异于禽兽,人类也不会发展到今天。我们搞IT的,就是为人类更好的服务的。要不怎么叫IT服务业呢。就是要更加追求效率,做出更快、更方便客户使用的软件产品。有这种思想才能更好的为人类服务。
好了,废话不多说了。刚才谈到条件变量是为了追求效率而产生的,那么它是怎么追求效率的呢?在说这个之前,我们先说说是谁浪费了时间。
考虑如下应用场景:
缓冲区写入线程向一个共享缓冲区写入数据,缓冲区读取线程从共享缓冲区读取数据。问题来了,怎么更高效读写缓冲区,使得缓冲区读写耗费更少的CPU资源?
为什么会说更高效呢?缓冲区写入线程不断往里写,读取线程不断读不就完了。问题恰恰就出在这个不断上!什么叫不断?一秒写一次算不断吗?一分钟写一次算不算不断,一天呢?一月呢?因此当我们不能预测到写入线程写入数据的频率时,数据读取线程只能以一种经验值的方式(比如1min)或者等待通知的方式进行读取。而经验值的方式就是浪费时间、耗费CPU资源的元凶。
那么等待通知的方式如何实现呢?答案就是条件变量。
在讨论boost条件变量之前我们先看看linux和windows系统上条件变量是如何使用的。
1、posix条件变量
条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
—《APUE》第11章 11.6.6 条件变量
理论太空洞,直接上代码。
在上述例子中只有一个条件,那就是PthreadReader需要等待缓冲区数据超过10个时才进行读取,否则将等待条件满足。
简单易用是一方面,还有一方面是boost既支持原有操作系统的功能,又在其上进行了扩展,使C++变得更加强大。
今天我们谈谈boost对条件变量的支持。首先,先说说条件变量是干什么的。FOR EFFICIENCY!为了效率!
其实世界上大部分东西的发明都是为了能够更快的干某一件事情。比如飞机,比如火箭。其实没有飞机,我们可以多走几天,几个月一样可以到达目的地。但是,如果都有这种思想,无异于禽兽,人类也不会发展到今天。我们搞IT的,就是为人类更好的服务的。要不怎么叫IT服务业呢。就是要更加追求效率,做出更快、更方便客户使用的软件产品。有这种思想才能更好的为人类服务。
好了,废话不多说了。刚才谈到条件变量是为了追求效率而产生的,那么它是怎么追求效率的呢?在说这个之前,我们先说说是谁浪费了时间。
考虑如下应用场景:
缓冲区写入线程向一个共享缓冲区写入数据,缓冲区读取线程从共享缓冲区读取数据。问题来了,怎么更高效读写缓冲区,使得缓冲区读写耗费更少的CPU资源?
为什么会说更高效呢?缓冲区写入线程不断往里写,读取线程不断读不就完了。问题恰恰就出在这个不断上!什么叫不断?一秒写一次算不断吗?一分钟写一次算不算不断,一天呢?一月呢?因此当我们不能预测到写入线程写入数据的频率时,数据读取线程只能以一种经验值的方式(比如1min)或者等待通知的方式进行读取。而经验值的方式就是浪费时间、耗费CPU资源的元凶。
那么等待通知的方式如何实现呢?答案就是条件变量。
在讨论boost条件变量之前我们先看看linux和windows系统上条件变量是如何使用的。
1、posix条件变量
条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
—《APUE》第11章 11.6.6 条件变量
理论太空洞,直接上代码。
#include <pthread.h> struct SBuffer { pthread_mutex_t objMutex; char buf[1024]; int size; //作为条件 }; struct SBuffer sharedBuffer; //共享的数据缓冲区 sharedBuffer.objMutex = PTHREAD_MUTEX_INITIALIZE; pthread_cond_t condSize = PTHREAD_COND_INITIALIZE; //条件变量 void PthreadReader(void) { char buf[10]; for(;;) { pthread_mutex_lock(&sharedBuffer.objMutex); while(sharedBuffer.size < 10) {//如果缓冲区个数不足10个则等待 pthread_cond_wait(&condSize, &sharedBuffer.objMutex); } pop(sharedBuffer, buf, 10);//从缓冲区弹出10个字符 sharedBuffer.size -= 10; pthread_mutex_unlock(&sharedBuffer.objMutex); } } void PthreadWriter(void) { pthread_mutex_lock(&sharedBuffer.objMutex); push(sharedBuffer,3); //向缓冲区插入3个字符 pthread_mutex_unlock(&sharedBuffer.objMutex); pthread_cond_signal(&condSize ); }
在上述例子中只有一个条件,那就是PthreadReader需要等待缓冲区数据超过10个时才进行读取,否则将等待条件满足。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- 如何组织构建多文件 C 语言程序(二)
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- 如何重装TCP/IP协议
- c语言实现hashmap(转载)
- Linux 信号signal处理机制