boost多執行緒程式設計(一)
阿新 • • 發佈:2019-02-18
一.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()會回收該執行緒,終止整個程式。