您的位置:首页 > 运维架构 > Linux

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 条件变量

理论太空洞,直接上代码。

#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个时才进行读取,否则将等待条件满足。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  boost c语言 linux windows