boost多线程编程(一)

一.thread线程的创建

1.线程就是在进程空间中运行的一个函数

2.线程创建时需要传递给thread对象一个函数对象或函数

3.传递的函数有参数时,可以直接传递给thread对象,并在调用时候发生拷贝。

4.参数较大时,可以传递给线程一个引用值,需要使用ref库进行封装。引用的对象在线程执行时一直存在

二.下面我们来看个简单的例子

   #include <boost/bind.hpp>
   #include <boost/thread/thread.hpp>
   #include <iostream>

   void hello(char* data)
   {
           std::cout <<
           "Hello world, I'm a thread!"
           << data << std::endl;
  }

  int main(int argc, char* argv[])
  {
          char* data = "nihao!";
          boost::thread thrd(&hello,data);//线程中传入函数hello 地址,并传入参数data
          //boost::thread thrd(boost::bind(hello,data));
          thrd.join();  
          return 0;
  }

boost::thread thrd(&hello,data),也可以传入函数对象,boost::thread thrd(hello,data),当然也可以使用boost::bind的形式来传入函数的参数。为了防止程序的终止,需要对新建的线程调用join()方法。join()方法是一个阻塞调用,暂停当前的线程,一直等到调用join()函数的线程运行结束。上例子中的main()函数会一直等待到thread()运行结束。


三.线程的中断

thread中的成员函数,允许运行的线程被中断,被中断的线程会抛出一个异常,thread_interrupt,这是一个空的类,应该在线程的catch中捕捉,并处理。如果不处理,默认是终止线程。

下面来看一个简单的例子:

#include <boost/thread.hpp> 
#include <iostream> 

void wait(int seconds) 
{ 
  boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 
} 

void thread() 
{ 
  try 
  { 
    for (int i = 0; i < 5; ++i) 
    { 
      wait(1); 
      std::cout << i << std::endl; 
    } 
  } 
  catch (boost::thread_interrupted&) 
  { 
   std::cout << "--this is interrupt--!" <<std::endl;
  } 
} 

int main() 
{ 
  boost::thread t(thread); 
  wait(3); 
  t.interrupt(); 
  t.join(); 
} 

上面例子的运行结果:


只打印0 和1,打印2时,线程调用interrupt(),中断该线程,线程运行终止。catch()中可以捕捉到中断抛出的异常,上例子中的catch()不做任何操作,由于thread函数在捕捉到异常后,处理完后程序返回,线程也被终止了。这样main()函数中的t.join()会回收该线程,终止整个程序。

猜你喜欢

转载自blog.csdn.net/lq_fly_pig/article/details/80642161