c++並發編程之創建線程


以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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM