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

来源:互联网 发布:国内java大牛的博客 编辑:程序博客网 时间:2024/04/29 19:19

线程组

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()); }
原创粉丝点击