boost::thread

转载 2015年11月19日 16:39:02

最近在做一个消息中间件里面涉及到多线程编程,由于跨平台的原因我采用了boost线程库。在创建线程时遇到了几种线程创建方式现总结如下:  
  首先看看boost::thread的构造函数吧,boost::thread有两个构造函数: 
(1)thread():构造一个表示当前执行线程的线程对象; 
(2)explicit thread(const boost::function0<void>& threadfunc): 
     boost::function0<void>可以简单看为:一个无返回(返回void),无参数的函数。这里的函数也可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,在下面有例子。 
第一种方式:最简单方法 
#include <boost/thread/thread.hpp> 
#include <iostream> 
  
void hello() 

        std::cout << 
        "Hello world, I''m a thread!" 
        << std::endl; 

  
int main(int argc, char* argv[]) 

        boost::thread thrd(&hello); 
        thrd.join(); 
        return 0; 

第二种方式:复杂类型对象作为参数来创建线程: 
#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(int argc, char* argv[]) 

        boost::thread thrd1(count(1)); 
        boost::thread thrd2(count(2)); 
        thrd1.join(); 
        thrd2.join(); 
        return 0; 

第三种方式:在类内部创建线程; 
(1)类内部静态方法启动线程 
#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(int argc, char* argv[])
{
 HelloWorld::start();
 
 return 0;

在这里start()和hello()方法都必须是static方法。 
(2)如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程: 
#include <boost/thread/thread.hpp>
#include <boost/bind.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(int argc, char* argv[])
{
 HelloWorld hello;
 hello.start();
 return 0;

(3)在Singleton模式内部创建线程: 
#include <boost/thread/thread.hpp>
#include <boost/bind.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(int argc, char* argv[])
{
 HelloWorld::start();

 return 0;

第四种方法:用类内部函数在类外部创建线程; 
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <string>
#include <iostream> 
class HelloWorld
{
public:
 void hello(const std::string& str)
 {
        std::cout <<str<< std::endl;
 }
}; 
  
int main(int argc, char* argv[])

 HelloWorld obj;
 boost::thread thrd( boost::bind(&HelloWorld::hello,&obj,"Hello 
                               world, I''m a thread!" ) ) ;
 thrd.join();
 return 0;

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

C++_Boost_Thread_编程指南

  • 2014年04月15日 21:52
  • 79KB
  • 下载

Boost_thread库例程

  • 2012年07月19日 17:40
  • 19KB
  • 下载

boost::thread编程-线程中断

boost::thread编程-线程中断

boost thread扩展

  • 2008年09月10日 19:11
  • 6KB
  • 下载

boost-thread-1.41.0-11.el6_1.2.i686.rpm

  • 2015年06月30日 22:49
  • 41KB
  • 下载

新手,Visual Studio 2013 配置Boost库。 如何编译和选择,遇到无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的解决办法

VS2013 配置Boost

boost::thread编程指南

  • 2013年05月09日 14:31
  • 29KB
  • 下载

C++ Boost Thread 编程指南

  • 2011年12月19日 14:18
  • 178KB
  • 下载

BOOST 库 thread类线程使用 多线程处理的理解

hread库为C++增加了线程处理能力,它提供简明清晰的线程、互斥量等概念,可以容易地创建多线程应用程序。thread库也是高度可移植的,它支持使用最广泛的windows和POSIX[Unix下应用程...

Visual Studio 2013 配置Boost库。 如何编译和选择,遇到无法打开文件“libboost_thread-vc120-mt-gd-1_58.lib的解决办法

1.首先你需要去下载最新的boost,www.boost.org ,我下的1.58版本。 2.解压到文件夹,我解压到了E:\boost。 3.在开始菜单打开Visual Studio Tools,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:boost::thread
举报原因:
原因补充:

(最多只允许输入30个字)