Boost::Thread使用示例
2014-06-04 17:01
281 查看
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)最简单方法
(2)复杂类型对象作为参数来创建线程
(3)在类内部创建线程
类内部静态方法启动线程
在这里,start()和hello()方法都必须是static方法。如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程:
(3)在Singleton模式内部创建线程:
(4)用类内部函数在类外部创建线程
如果需要绑定的函数有参数则需要使用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结合起来使用。
参考:
/article/6983286.html
http://www.blogjava.net/LittleDS/archive/2008/05/18/201236.html
Boost::Thread有两个构造函数:一个是thread(),构造一个表示当前执行线程的线程对象;一个是explicit thread(const boost::function0<void>& threadfunc),这里的boost::function0<void>可以简单看为一个无返回无参数的函数。这里的函数可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,可以看下面的几个例子。
(1)最简单方法
#include <boost/thread/thread.hpp> #include <iostream> void hello() { std::cout<<"Hello world, I'm a thread!"<<std::endl; } int main() { boost::thread thrd(&hello); thrd.join(); system("pause"); return 0; }
(2)复杂类型对象作为参数来创建线程
#include <boost/thread/thread.hpp> #include <boost/thread/mutex.hpp> #include <iostream> boost::mutex io_mutex; struct count { count(int id) : id(id) {} void operator()() { for(int i = 0; i < 10; ++i) { boost::mutex::scoped_lock lock(io_mutex); std::cout<<id<<": "<<i<<std::endl; } } int id; }; int main() { boost::thread thrd1(count(1)); boost::thread thrd2(count(2)); thrd1.join(); thrd2.join(); system("pause"); return 0; }
(3)在类内部创建线程
类内部静态方法启动线程
#include <boost/thread/thread.hpp> #include <iostream> class HelloWorld { public: static void hello() { std::cout<<"Hello world, I'm a thread!"<<std::endl; } static void start() { boost::thread thrd(hello); thrd.join(); } }; int main() { HelloWorld::start(); system("pause"); return 0; }
在这里,start()和hello()方法都必须是static方法。如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程:
#include <boost/function/function0.hpp> #include <boost/thread/thread.hpp> #include <iostream> class HelloWorld { public: void hello() { std::cout<<"Hello world, I'm a thread!"<<std::endl; } void start() { boost::function0<void> f = boost::bind(&HelloWorld::hello, this); boost::thread thrd(f); thrd.join(); } }; int main() { HelloWorld hello; hello.start(); system("pause"); return 0; }
(3)在Singleton模式内部创建线程:
#include <boost/thread/thread.hpp> #include <iostream> class HelloWorld { public: void hello() { std::cout<<"Hello world, I'm a thread!"<<std::endl; } static void start() { boost::thread thrd(boost::bind(&HelloWorld::hello, &HelloWorld::getInstance())); thrd.join(); } static HelloWorld& getInstance() { if(!instance) instance = new HelloWorld; return *instance; } private: HelloWorld() {} static HelloWorld* instance; }; HelloWorld* HelloWorld::instance = 0; int main() { HelloWorld::start(); system("pause"); return 0; }
(4)用类内部函数在类外部创建线程
#include <boost/thread/thread.hpp> #include <iostream> #include <string> class HelloWorld { public: void hello(const std::string& str) { std::cout<<str<<std::endl; } }; int main() { HelloWorld obj; boost::thread thrd(boost::bind(&HelloWorld::hello, &obj, "Hello World, I'm a thread!")); thrd.join(); system("pause"); return 0; }
如果需要绑定的函数有参数则需要使用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结合起来使用。
参考:
/article/6983286.html
http://www.blogjava.net/LittleDS/archive/2008/05/18/201236.html
相关文章推荐
- Boost::Thread使用示例
- 一个使用boost::thread_specific_ptr线程本地存储的示例,value将不受其它线程影响
- Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET
- Boost::Thread使用示例
- Boost::Thread使用示例
- Boost::Thread使用示例
- boost::thread使用方法
- boost c++ lib on linux(3) - thread库的使用初学
- 使用boost.bind绑定class的成员函数作为boost thread的入口
- boost::share_ptr智能指针使用示例
- 异步编程中使用帮助类来实现Thread.Start()的示例
- Boost.asio的简单使用(timer,thread,io_service类)
- Visual Studio 2010 下 Boost.Thread 库的使用笔记
- Boost编程之--使用thread类提高线程开发效率
- boost中circular_buffer存储字符串的使用示例
- 【boost】使用装饰者模式改造boost::thread_group
- boost::thread 使用函数对象来构造线程对象的问题
- boost.property_tree使用示例
- Boost::thread库的使用
- Boost::thread库的使用