zoukankan      html  css  js  c++  java
  • boost::thread 库的使用

    转载自: http://blog.csdn.net/yockie/article/details/9181939

    概要

    通过实例介绍boost thread的使用方式,本文主要由线程启动、Interruption机制、线程同步、等待线程退出、Thread Group几个部份组成。

    正文

    线程启动

    线程可以从以下三种方式启动:第一种用struct结构的operator成员函数启动:

    #include<iostream>
    #include <boost/thread.hpp>  
    
    struct Callable
    {
        void operator()()
        {
            
            //do something here
            std::cout<<"thread running structure operator ()!"<<std::endl;
        }
    };
    
    int main()
    {
        Callable x;
        boost::thread st(x);
    
        return 0;        
    }

    第二种以非成员函数形式启动线程

    void func(int para)
    {
        std::cout<<"thread runnign non-class function"<<"	"<<para<<std::endl;
    
    }
    
    int main()
    {
    
        boost::thread f(func, 100);
        return 0;
    }

    第三种以成员函数形式启动线程

    #include<boost/bind.hpp>
    #include<iostream>
    #include<boost/thread.hpp>
    
    
    class TestBind
    {
    public:
        void testFunc(int c)
        {
            std::cout<<"thread running class member functions!"<<"	"<<c<<std::endl;
        }
    
    };
    
    int main()
    {
        TestBind testBind;
        boost::thread cf(boost::bind(&TestBind::testFunc, &testBind, 123));  
        return 0;
        
    }

    Interruption机制

    可以通过thread对象的interrupt函数,通知线程,需要interrupt。线程运行到interruption point就可以退出。Interruption机制举例:

    #include <iostream>  
    #include <boost/thread.hpp>  
    using namespace std; 
    
    void f()  
    {  
        for(int i=1;i<0x0fffffff;i++)  
        {  
            if(i%0xffffff==0)  
            {  
                std::cout<<"i="<<((i&0x0f000000)>>24)<<endl;  
                cout<<"boost::this_thread::interruption_requested()="<<boost::this_thread::interruption_requested()<<endl;  
                if(((i&0x0f000000)>>24)==5)  
                {  
              boost::this_thread::interruption_point();  
                }  
            }  
        }  
    }  

    int main()
    {
    boost::thread t(f);

    t.interrupt();

      t.join();

      return 0;

    }

    t.interrupt();告诉t线程,现在需要interrupt。boost::this_thread::interruption_requested()可以得到当前线程是否有一个interrupt请求。若有interrupt请求,线程在运行至interruption点时会结束。boost::this_thread::interruption_point();就是一个interruption point。Interruption point有多种形式,较常用的有boost::this_thread::sleep(boost::posix_time::seconds(5));当没有interrupt请求时,这条语句会让当前线程sleep五秒,若有interrupt requirement线程结束。
    如何使线程在运行到interruption point的时候,不会结束,可以参考下面的例子:

    void f()  
    {  
        for(int i=1;i<0x0fffffff;i++)  
        {  
            if(i%0xffffff==0)  
            {  
                std::cout<<"i="<<((i&0x0f000000)>>24)<<endl;  
                cout<<"boost::this_thread::interruption_requested()="<<boost::this_thread::interruption_requested()<<endl;  
                if(((i&0x0f000000)>>24)==5)  
                {  
                    //boost::this_thread::interruption_point();  
    
                     boost::this_thread::disable_interruption di;  
                    {  
                         boost::this_thread::interruption_point();  
                    }  
                }  
            }  
        }  
    } 

    注意boost::this_thread::disable_interruption这条语句的使用,它可以使大括号内的interruption point不会中断当前线程。

    线程同步

    Boost提供了多种lock导致上手需要较长时间,还是看下面线程同步的例子比较简单,相信在多数应用中足够:直接使用boost::mutex的例子

    static boost::mutex g_m;  
    //do something here 
    g_m.lock();  
    //do something what needs to be locked
    g_m.unlock();  
    
    if(g_m.try_lock())  
    {  
      //do something what needs to be locked
    } 
    #include <iostream>  
    #include <string>  
    #include <boost/thread.hpp>  
    #include <boost/thread/mutex.hpp>  
    #include <boost/thread/locks.hpp>  
      
    using namespace std;   
      
    static boost::mutex g_m;  
      
    void f(string strName)  
    {  
        for(int i=1;i<0x0fffffff;i++)  
        {  
            if(i%0xffffff==0)  
            {  
                boost::lock_guard<boost::mutex> lock(g_m);  
                cout<<"Name="<<strName<<" i="<<((i&0x0f000000)>>24)<<endl;  
            }  
        }  
    }  
      
    int _tmain(int argc, _TCHAR* argv[])  
    {  
      boost::thread t(f,string("inuyasha"));  
      boost::thread t2(f,string("kagula"));  
      boost::thread t3(f,string("kikyou"));  
      
      {  
          boost::lock_guard<boost::mutex> lock(g_m);  
          cout<<"thread id="<<t.get_id()<<endl;  
      }  
      
      t.join();  
      t2.join();  
      t3.join();  
      
      return 0;  
    }                  

    使用unique lock的例子

    #include <iostream>  
    #include <string>  
    #include <boost/thread.hpp>  
    #include <boost/thread/mutex.hpp>  
    #include <boost/thread/locks.hpp>  
      
    using namespace std;  
      
    static boost::mutex g_m;  
      
    void f(string strName)  
    {  
      cout<<"Thread name is "<<strName<<"-----------------begin"<<endl;  
      for(int i=1;i<0x0fffffff;i++)  
      {  
        if(i%0xffffff==0)  
        {  
          boost::unique_lock<boost::mutex> lock(g_m);  
          cout<<"Name="<<strName<<" i="<<((i&0x0f000000)>>24)<<endl;  
          lock.unlock();  
         }  
      }  
      cout<<"Thread name is "<<strName<<"-----------------end"<<endl;  
    }  
      
    int _tmain(int argc, _TCHAR* argv[])  
    {  
      boost::thread t(f,string("inuyasha"));  
      boost::thread t2(f,string("kagula"));  
      boost::thread t3(f,string("kikyou"));  
      
      t.join();  
      t2.join();  
      t3.join();  
      
      return 0;  
    } 

    同Lock_guard相比
    [1]Unique lock中有owns lock成员函数,可判断,当前有没有被lock。
    [2]在构造Unique Lock时可以指定boost::defer_lock_t参数推迟锁定,直到Unique Lock实例调用Lock。或采用下面的编码方式使用:
    boost::unique_lock<boost::mutex> lock(mut,boost::defer_lock);
    boost::unique_lock<boost::mutex> lock2(mut2,boost::defer_lock);
    boost::lock(lock,lock2);
    [3]它可以和Conditoin_variable配合使用。
    [4]提供了try lock功能。

    如果线程之间执行顺序上有依赖关系,直接到boost官网中参考条件变量(Condition variables)的使用。官网关于Conditon Variables的说明还是容易看懂的。
    注意,使用一个不恰当的同步可能消耗掉1/2以上的cpu运算能力。
    Thread Group

    线程组使用示例,其中f函数在上面的例子已经定义

    int _tmain(int argc, _TCHAR* argv[])  
    {  
      boost::thread_group tg;  
      tg.add_thread(new boost::thread(f,string("inuyasha")));  
      tg.add_thread(new boost::thread(f,string("kagula")));  
      tg.add_thread(new boost::thread(f,string("kikyou")));  
      
      tg.join_all();  
      
      return 0;  
    }  



  • 相关阅读:
    spring中Bean的懒加载
    ActiveMQ学习教程
    Maven中解决jar包冲突的三种方式
    Spring的日志管理
    mybatis使用collection查询集合属性规则
    springcloud之Feign伪装
    springcloud之Hystrix熔断入门
    springcloud的负载均衡Ribbon入门
    springcloud的Eureka启动时报错:Connection refused: connect
    springboot启动过程中出现You must configure either the server or JDBC driver (via the serverTimezone configuration
  • 原文地址:https://www.cnblogs.com/flyinggod/p/7909796.html
Copyright © 2011-2022 走看看