zoukankan      html  css  js  c++  java
  • Boost::Thread使用示例

    Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET

    Boost::Thread使用示例

    分类: C/C++ 5926人阅读 评论(3) 收藏 举报

    Boost::Thread的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的线程选项的不同,分别决定使用Windows线程API,pThread,或Mac平台的thread实现。以下只讨论Windows,即使用BOOST_HAS_WINTHREAD的情况。

    Boost::Thread有两个构造函数:一个是thread(),构造一个表示当前执行线程的线程对象;一个是explicit thread(const boost::function0<void>& threadfunc),这里的boost::function0<void>可以简单看为一个无返回无参数的函数。这里的函数可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,可以看下面的几个例子。

    (1)最简单方法

     

    1. #include <boost/thread/thread.hpp>  
    2. #include <iostream>  
    3.   
    4. void hello()  
    5. {  
    6.     std::cout<<"Hello world, I'm a thread!"<<std::endl;  
    7. }  
    8.   
    9. int main()  
    10. {  
    11.     boost::thread thrd(&hello);  
    12.     thrd.join();  
    13.   
    14.     system("pause");  
    15.     return 0;  
    16. }  

     

    (2)复杂类型对象作为参数来创建线程

     

    1. #include <boost/thread/thread.hpp>  
    2. #include <boost/thread/mutex.hpp>  
    3. #include <iostream>  
    4.   
    5. boost::mutex io_mutex;  
    6.   
    7. struct count  
    8. {  
    9.     count(int id) : id(id) {}  
    10.   
    11.     void operator()()  
    12.     {  
    13.         for(int i = 0; i < 10; ++i)  
    14.         {  
    15.             boost::mutex::scoped_lock lock(io_mutex);  
    16.             std::cout<<id<<": "<<i<<std::endl;  
    17.         }  
    18.     }  
    19.   
    20.     int id;  
    21. };  
    22.   
    23. int main()  
    24. {  
    25.     boost::thread thrd1(count(1));  
    26.     boost::thread thrd2(count(2));  
    27.     thrd1.join();  
    28.     thrd2.join();  
    29.   
    30.     system("pause");  
    31.     return 0;  
    32. }  

     

    (3)在类内部创建线程

    类内部静态方法启动线程

     

    1. #include <boost/thread/thread.hpp>  
    2. #include <iostream>  
    3.   
    4. class HelloWorld  
    5. {  
    6. public:  
    7.     static void hello()  
    8.     {  
    9.         std::cout<<"Hello world, I'm a thread!"<<std::endl;  
    10.     }  
    11.     static void start()  
    12.     {  
    13.         boost::thread thrd(hello);  
    14.         thrd.join();  
    15.     }  
    16. };  
    17.   
    18. int main()  
    19. {  
    20.     HelloWorld::start();  
    21.   
    22.     system("pause");  
    23.     return 0;  
    24. }  
    在这里,start()和hello()方法都必须是static方法。如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程:

     

     

    1. #include <boost/function/function0.hpp>  
    2. #include <boost/thread/thread.hpp>  
    3. #include <iostream>  
    4.   
    5. class HelloWorld  
    6. {  
    7. public:  
    8.     void hello()  
    9.     {  
    10.         std::cout<<"Hello world, I'm a thread!"<<std::endl;  
    11.     }  
    12.     void start()  
    13.     {  
    14.         boost::function0<void> f = boost::bind(&HelloWorld::hello, this);  
    15.         boost::thread thrd(f);  
    16.         thrd.join();  
    17.     }  
    18. };  
    19.   
    20. int main()  
    21. {  
    22.     HelloWorld hello;  
    23.     hello.start();  
    24.   
    25.     system("pause");  
    26.     return 0;  
    27. }  

    (3)在Singleton模式内部创建线程:

     

    1. #include <boost/thread/thread.hpp>  
    2. #include <iostream>  
    3.   
    4. class HelloWorld  
    5. {  
    6. public:  
    7.     void hello()  
    8.     {  
    9.         std::cout<<"Hello world, I'm a thread!"<<std::endl;  
    10.     }  
    11.     static void start()  
    12.     {  
    13.         boost::thread thrd(boost::bind(&HelloWorld::hello, &HelloWorld::getInstance()));  
    14.         thrd.join();  
    15.     }  
    16.     static HelloWorld& getInstance()  
    17.     {  
    18.         if(!instance)  
    19.             instance = new HelloWorld;  
    20.         return *instance;  
    21.     }  
    22. private:  
    23.     HelloWorld() {}  
    24.     static HelloWorld* instance;  
    25. };  
    26.   
    27. HelloWorld* HelloWorld::instance = 0;  
    28. int main()  
    29. {  
    30.     HelloWorld::start();  
    31.   
    32.     system("pause");  
    33.     return 0;  
    34. }  
    (4)用类内部函数在类外部创建线程

     

     

    1. #include <boost/thread/thread.hpp>  
    2. #include <iostream>  
    3. #include <string>  
    4.   
    5. class HelloWorld  
    6. {  
    7. public:  
    8.     void hello(const std::string& str)  
    9.     {  
    10.         std::cout<<str<<std::endl;  
    11.     }  
    12. };  
    13.   
    14. int main()  
    15. {  
    16.     HelloWorld obj;  
    17.     boost::thread thrd(boost::bind(&HelloWorld::hello, &obj, "Hello World, I'm a thread!"));  
    18.     thrd.join();  
    19.   
    20.     system("pause");  
    21.     return 0;  
    22. }  

     

    1. 如果需要绑定的函数有参数则需要使用boost::bind。比如想使用boost::thread创建一个线程来执行函数void f(int i),如果这样写boost::thread thrd(f)是不对的,因为thread构造函数声明接受的是一个没有参数且返回类型为void的函数,而且不提供参数f也无法运行,这时就可以写boost::thread thrd(boost::bind(f, 1))。涉及到有参函数的绑定问题基本上都是boost::thread、boost::function、boost::bind结合起来使用。  
    参考:

     

     

    http://www.cnblogs.com/VRS_technology/archive/2010/09/15/1826812.html

    http://www.blogjava.net/LittleDS/archive/2008/05/18/201236.html


     

     

     

  • 相关阅读:
    Java IO 流 一些散乱的笔记
    Java IO 流
    Java 枚举
    Java 内部类种类及使用解析
    Java 事件适配器 Adapter
    Java 异常基础 Exception
    Java中内置的观察者模式
    Java 代理模式(一) 静态代理
    Java 可变参数
    Java中的反射机制(二) 一个利用反射进行对象拷贝的例子
  • 原文地址:https://www.cnblogs.com/lexus/p/3620956.html
Copyright © 2011-2022 走看看