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 

posted @ 2018-06-11 13:09  KeepInYourMind  阅读(2485)  评论(0编辑  收藏  举报