05 使用C++11让多线程开发变得简单

std::thread

  1. #include <thread>
  2. void func()
  3. {
  4. // do some work
  5. }
  6. int main()
  7. {
  8. std::thread t(func);
  9. t.join();
  10. return 0;
  11. }

gcc注意加-pthread编译选项

  • func函数将会运行与线程对象中t中,
  • join函数将会阻塞线程,直到线程函数执行结束, 如果线程函数有返回值,返回值将被忽略

如果不希望线程被阻塞执行,可以调用线程的detach()方法, 将线程和线程对象分离.
通过 detach, 线程就和线程对象分离了,让线程作为后台线程去执行,当前线程也不会阻塞了。但需要注意的是,detach 之后就无法再和线程发生联系了,比如 detach 之后就不能再通过 join 来等待线程执行完,线程何时执行完我们也无法控制了

  1. #include <thread>
  2. void func()
  3. {
  4. // do some work
  5. }
  6. int main()
  7. {
  8. std::thread t(func);
  9. t.detach();
  10. return 0;
  11. }

线程还可以接收任意个数的参数

  1. #include <thread>
  2. #include <iostream>
  3. void func(int i, double d, const std::string& s)
  4. {
  5. std::cout << i << ", " << d << ", " << s << "\n";
  6. }
  7. int main()
  8. {
  9. std::thread t(func, 1, 2, "test");
  10. t.join();
  11. return 0;
  12. }

std::thread出了作用域之后将会析构,这时如果线程函数还没有执行完则会发生错误,因此,需要保证线程函数的生命周期在线程变量std::thread的生命周期之内

  1. #include <thread>
  2. void func()
  3. {
  4. // do some work
  5. }
  6. int main()
  7. {
  8. std::thread t(func);
  9. std::thread t1(std::move(t));
  10. // t.join(); // 会报错
  11. t1.join();
  12. return 0;
  13. }

线程被移动之后,线程对象t将不再代表任何线程了

勘误 https://www.runoob.com/w3cnote/cpp-std-thread.html

可以通过std::bind或lambda表达式来创建线程