[Boost基础]并发编程——Thread多线程(三)

线程组

thread库提供类thread_group用于管理一组线程,就像是一个线程池,它内部使用std::list<thread*>来容纳创建的thread对象。成员函数有:and_thread(),remove_thread(),join_all(),interrupt_all()

条件变量

条件变量时thread库提供的另一种用于等待的同步机制,可以实现线程间的通信,它必须与互斥量配合使用,等待另一个线程中某个事件的发生(满足某个条件),然后线程才能继续执行。thread库提供两种条件变量对象condition_variable和condition——variable_any,一般情况下我们应该使用condition_variable_any,它能够适应更广泛的互斥量类型。
条件变量的使用方法很简单
拥有条件变量的线程先锁定互斥量,然后循环检查某个条件,如果条件不满足,那么调用条件变量的成员函数wait()等待直至条件满足,其他线程处理条件变量要求的条件,当条件满足时调用它的成员函数notify_one()或notify_all(),以通知一个或者所有正在等待条件变量的线程停止等待继续执行。

#pragma  once 
#include <boost/thread.hpp>  
#include <boost/bind.hpp>   
#include <string>
#include <conio.h>   
using namespace boost;
template <typename T> class basic_atom : boost::noncopyable 
{
private:
	T n;
	typedef mutex mutex_t;//互斥量类型定义
	mutex_t mu;
public:
	basic_atom(T x=T()) : n(x){}//构造函数
	T operator++()//前置式递增操作符
	{
		mutex_t::scoped_lock lock(mu);//锁定互斥量
		return ++n;
	}
	operator T(){return n;}//类型转换操作符定义
};
mutex muIO;//io流是一个共享资源,不是线程;安全的,需要锁定
void printing(basic_atom<int>& x,const std::string& str)
{
	for (int i=0;i<5;i++)
	{
		mutex::scoped_lock lock(muIO);//锁定io流操作
		std::cout<<str<<++x<<std::endl;
	}
} 
//线程组
void test8()
{
	basic_atom<int> x;
	thread_group tg;
	tg.create_thread(boost::bind(printing,ref(x),"C++"));//成员函数create_thread()是一个工程函数,可以创建thread对象并运行线程,同时加入内部的list。我们可以在thread_group外部创建线程对象,使用add_thread()加入线程组,使用remove_thread()来删除list里的thread对象。
	tg.create_thread(boost::bind(printing,ref(x),"boost"));
	tg.join_all();
	//使用thread_group,我们可以为程序建立一个类似于全局线程池的对象,统一管理程序中使用的thread。
}
void test(char t)
{
	std::cout<<"press key====="<<t<<std::endl;
	switch (t)
	{  
	case '1':test8();break; 
	case 27:
	case 'q':exit(0);break;
	default: std::cout<<"default "<<t<<std::endl;break;
	}
}
void main()
{
	while(1) 
		test(getch()); 
}

你可能感兴趣的:([Boost基础]并发编程——Thread多线程(三))