1. 程式人生 > >boost多執行緒程式設計(一)

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()會回收該執行緒,終止整個程式。