以boost為例。boost::thread有兩個構造函數:
(1)thread():構造一個表示當前執行線程的線程對象;
(2)explicit thread(const boost::function0<void>& threadfunc):
boost::function0<void>可以簡單看為:一個無返回(返回void),無參數的函數。這里的函數也可以是類重載operator()構成的函數;該構造函數傳入的是函數對象而並非是函數指針,這樣一個具有一般函數特性的類也能作為參數傳入。
方法1:通過無參數的函數創建線程
#include <iostream> #include <boost/thread.hpp> void Hello() { // 睡眠一秒以模擬數據處理。 boost::this_thread::sleep(boost::posix_time::seconds(1)); std::cout << "Hello, World!" << std::endl; } int main() { // 創建一個線程對象,注意函數 Hello 將立即運行。 boost::thread hello_thread(Hello); // 等待線程結束。 // 否則線程還沒執行(完),主程序就已經結束了。 hello_thread.join(); return 0; }
方法2:通過帶參數的函數創建線程
#include <iostream> #include <boost/thread.hpp> void Hello(const char* what) { // 睡眠一秒以模擬數據處理。 boost::this_thread::sleep(boost::posix_time::seconds(1)); std::cout << "Hello, " << what << "!" << std::endl; } int main() { boost::thread hello_thread(Hello, "World"); // 等價於使用 bind: // boost::thread hello_thread(boost::bind(&Hello, "World")); hello_thread.join(); return 0; }
方法3:通過一個函數對象,即仿函數(functor)創建線程
#include <iostream> #include <boost/thread.hpp> class Hello { public: void operator()(const char* what) { boost::this_thread::sleep(boost::posix_time::seconds(1)); std::cout << "Hello, " << what << "!" << std::endl; } }; int main() { Hello hello; // 方式一:拷貝函數對象。 boost::thread hello_thread(hello, "World"); hello_thread.join(); // 方式二:不拷貝函數對象,通過 boost::ref 傳入引用。 // 用戶必須保證被線程引用的函數對象,擁有超出線程的生命期。 // 比如這里通過 join 線程保證了這一點。 boost::thread hello_thread_ref(boost::ref(hello), "World"); hello_thread_ref.join(); return 0; }
方法4:通過一個成員函數創建線程
與前例不同之處在於,需要以 bind 綁定 this 指針作為第一個參數。
#include <iostream> #include <boost/thread.hpp> class Hello { public: Hello() { boost::thread hello_thread(boost::bind(&Hello::Entry, this, "World")); hello_thread.join(); } private: // 線程函數 void Entry(const char* what) { boost::this_thread::sleep(boost::posix_time::seconds(1)); std::cout << "Hello, " << what << "!" << std::endl; } }; int main() { Hello hello; return 0; }
tip: 關於thread::join() 和thread::detach(), 參見https://www.cnblogs.com/zhanghu52030/p/9166526.html
