条件变量
如果线程之间执行顺序上有依赖关系,可使用条件变量(Condition variables)。
可以到boost官网中参考条件变量(Condition variables)的使用。
条件变量必须和互斥量配合使用,等待另一个线程重某个事件的发生(满足某个条件),然后线程才能继续执行。
共有两种条件变量对象condition_variable, condition_variable_any,一般情况下使用condition_variable_any。
条件变量的使用方式:
拥有条件变量的线程先锁定互斥量,然后循环检查某个条件,如果条件不满足,那么就调用条件变量的成员函数wait()等待直到条件满足。其他线程处理条件变量要求的条件,当条件满足时调用它的成员函数notify_one()或者notify_all(),以通知一个或者所有正在等待条件的变量的线程停止等待继续执行。
例子:生产--消费模型。
缓冲区buffer使用了两个条件变量cond_put和cond_get,分别用于处理put动作和get动作,如果缓冲区满则cond_put持续等待,当cond_put得到通知 (缓冲区不满)时线程写入数据,然后通知cond_get条件变量可以获取数据。cond_get的处理流程与cond_put类似。
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>
#include <stack>
using namespace std;
boost::mutex io_mu;
class buffer
{
private:
boost::mutex mu; // 互斥量,配合条件变量使用
boost::condition_variable_any cond_put; // 写入条件变量
boost::condition_variable_any cond_get; // 读取条件变量
stack<int> stk; // 缓冲区对象
int un_read, capacity;
bool is_full() // 缓冲区满判断
{
return un_read == capacity;
}
bool is_empty() // 缓冲区空判断
{
return un_read == 0;
}
public:
buffer(size_t n) : un_read(0), capacity(n){} // 构造函数
void put(int x) // 写入数据
{
{ // 开始一个局部域
boost::mutex::scoped_lock lock(mu); //锁定互斥量
while ( is_full() ) // 检查缓冲区是否满
{
{ // 局部域,锁定cout输出一条信息
boost::mutex::scoped_lock lock(io_mu);
cout << "full waiting..." << endl;
}
cond_put.wait(mu); // 条件变量等待
} // 条件变脸满足,停止等待
stk.push(x); // 压栈,写入数据
++un_read;
} // 解锁互斥量,条件变量的通知不需要互斥量锁定
cond_get.notify_one(); // 通知可以读取数据
}
void get(int *x) // 读取数据
{
{ // 局部域开始
boost::mutex::scoped_lock lock(mu); // 锁定互斥量
while (is_empty()) // 检查缓冲区是否空
{
{
boost::mutex::scoped_lock lock(io_mu);
cout << "empty waiting..." << endl;
}
cond_get.wait(mu); // 条件变量等待
}
--un_read;
*x = stk.top(); // 读取数据
stk.pop(); // 弹栈
}
cond_put.notify_one(); // 通知可以写入数据
}
};
buffer buf(5); // 一个缓冲区对象
void producter(int n) // 生产者
{
for (int i = 0; i < n; ++i)
{
{
boost::mutex::scoped_lock lock(io_mu);
cout << "put " << i << endl;
}
buf.put(i); // 写入数据
}
}
void consumer(int n) // 消费者
{
int x;
for (int i = 0; i < n; ++i)
{
buf.get(&x); // 读取数据
boost::mutex::scoped_lock lock(io_mu);
cout << "get " << x << endl;
}
}
int main()
{
boost::thread t1(producter, 20); // 一个生产者线程
boost::thread t2(consumer, 10); // 两个消费者线程
boost::thread t3(consumer, 10);
t1.join();
t2.join();
t3.join();
return 0;
}
运行结果:
empty waiting...
put 0
empty waiting...
put 1
put 2
get 1
get 2
get 0
empty waiting...
empty waiting...
put 3
put 4
put 5
put 6
put 7
get 6
get 7
get 5
get 4
get 3
empty waiting...
put 8
empty waiting...
put 9
put 10
put 11
get 9
get 11
get 8
empty waiting...
put 12
put 13
put 14
put 15
put 16
put 17
full waiting...
get 10
get 16
put 18
full waiting...
get 17
get 15
get 14
get 13
get 12
get 18
empty waiting...
put 19
get 19
分享到:
相关推荐
### C++ Boost Thread 编程指南精要解析 #### 前言:多线程编程在C++中的挑战与机遇 随着互联网应用、事务服务器以及图形用户界面(GUI)应用程序等现代软件系统的复杂性增加,多线程编程已成为提高程序性能和响应...
#### 四、Boost.Thread 与 C++ 标准库的关系 随着 C++11 的发布,C++ 标准库中引入了 `<thread>` 头文件,提供了一系列线程相关的功能。Boost.Thread 被认为是 C++11 标准线程库的基础之一,很多设计思想和技术被...
**Boost库中文文档**对于中国开发者来说是一份非常宝贵的资源,它帮助开发者理解和使用Boost库的各种组件,降低学习曲线,提高开发效率。文档通常包含了详细的功能介绍、使用示例和API参考,使得开发者能够快速掌握...
C++ Boost Thread 编程指南.doc
1. **Boost.And.STL学习资料**:这是一份关于如何结合使用Boost库和STL(Standard Template Library,标准模板库)的资源,两者都是C++编程中的重要工具,结合使用可以提高代码效率和可读性。 2. **An.Introduction....
1. **多线程支持**:Boost.Thread库提供了C++标准库中尚未包含的多线程编程接口,包括线程的创建、同步、线程局部存储等功能,有助于开发者编写高效的并发程序。 2. **智能指针**:Boost库中的smart_ptr系列(例如...
6. 线程管理:Boost.Thread库提供了C++标准库中没有的线程管理功能,如条件变量、线程池、异步调用等,使得在C++中编写多线程程序变得更加容易。 7. 日期时间处理:Boost.DateTime库提供了日期、时间和时间间隔的...
"C++BOOST中文帮助文档.zip"是一个压缩包,其中包含了一份Boost库的中文帮助文档,对于学习和使用Boost库的中文用户来说,这是一个非常宝贵的资源。 Boost库中的主要组件包括但不限于以下几个方面: 1. **智能指针...
最近开发中用到大量BOOST库的东西,现在把我开发中总结的boost使用方法分享一下,里面包括智能指针、boost定时器、boostthread和io_service等的用法和说明,还有一本Beyond the C++ Standard Library: An ...
**Boost库概述** Boost是一个开源的C++库集合,它为C++标准库提供了扩展,包含了大量的高效、高质量和跨平台的工具包...通过深入学习和合理应用Boost,开发者可以更好地利用C++的强大功能,解决实际项目中的各种挑战。
1.47版本的《C++ Boost手册》是开发者学习和使用Boost库的重要资源,它详细解释了每个库的用法、示例和注意事项,是提升C++编程技能不可或缺的参考书目。通过深入理解和熟练运用Boost库,开发者可以写出更高效、更...
**C++历史与Boost** C++起源于1979年,由Bjarne Stroustrup在C语言的基础上增加了类的概念,逐步发展成一种支持数据抽象、面向对象编程和泛型编程的通用编程语言。随着时间的推移,C++经历了多次重要的标准化进程,...
通过C++参考手册和Boost库中文版的学习,开发者可以深入理解C++的各个方面,从而编写出高效、可靠且易于维护的代码。这两个资源对于初学者和经验丰富的程序员都是宝贵的参考资料,能够提升编程技能和解决问题的能力...
C++ Boost Thread编程指南是关于如何在C++中利用Boost库进行多...最后,参考资料部分提供了更多深入学习Boost.Thread和其他相关技术的资源,帮助程序员更好地理解和利用这个强大的库来编写高效、可靠的多线程C++程序。
通过学习这本书,读者不仅可以掌握C++11和C++14的现代编程技巧,还能深入了解Boost库的应用,提高编程效率,编写出更高效、更可靠的软件。无论是对C++初学者还是经验丰富的开发者来说,都是一本不可多得的参考书籍。
Boost.Thread库提供了多线程编程的支持,包括线程创建、同步机制(如互斥量、条件变量)和线程安全的容器。这使得开发者能够轻松地在C++中实现并发和并行程序。 3. **算法**: Boost库包含了丰富的算法库,如`...
综上所述,Boost C++ Libraries不仅是一组强大的工具集,也为C++开发者提供了广阔的学习和发展空间。通过学习和应用Boost库,开发者可以提高自己的编程技能,同时也能为项目带来更高的生产力和效率。随着未来C++标准...
首先看看boost::thread的构造函数吧,boost::thread有两个构造函数: (1)thread():构造一个表示当前执行线程的线程对象; (2)explicit thread(const boost::function0& threadfunc): boost::function0可以...
Boost.Thread库则为C++提供了线程管理和同步原语,部分功能在C++11的std::thread和std::mutex等中得到了标准化。Boost.Bind和Boost.Lambda则为函数对象和函数绑定提供了支持,这在C++11的lambda表达式中得到了更简洁...