C++ thread库

参考cplusplus
参考cppreference

0.线程的基础知识

0.1 线程的状态

C++ thread库_第1张图片

0.2 c++线程的joinable和detached状态

  • joinable
    一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。
  • detached
    一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。

0.3 两种等待线程结束的方式

  • 当线程启动后,一定要在和线程相关联的thread销毁前,确定以何种方式等待线程执行结束。
    1)detach方式,启动的线程自主在后台运行,当前的代码继续往下执行,不等待新线程结束。
    2)join方式,等待启动的线程完成,才会继续往下执行。

1.构造函数

  • 注意第二个构造函数:
    新产生的线程会调用fn函数,该函数的参数由args给出。
template 
explicit thread (Fn&& fn, Args&&... args);

2.赋值操作

// move (1) 
thread& operator= (thread&& rhs) noexcept;
// copy [deleted] (2)   
thread& operator= (const thread&) = delete;
  • 当前对象不能是joinable的
// example for thread::operator=
#include        // std::cout
#include          // std::thread, std::this_thread::sleep_for
#include          // std::chrono::seconds
 
void pause_thread(int n) 
{
  std::this_thread::sleep_for (std::chrono::seconds(n));
  std::cout << "pause of " << n << " seconds ended\n";
}

int main() 
{
  std::thread threads[5];   // 该thread对象不是joinable

  std::cout << "Spawning 5 threads...\n";
  for (int i=0; i<5; ++i)
    threads[i] = std::thread(pause_thread,i+1);   // move-assign threads

  std::cout << "Done spawning threads. Now waiting for them to join:\n";
  for (int i=0; i<5; ++i)
    threads[i].join();

  std::cout << "All threads joined!\n";

  return 0;
}

3.判断对象是否是joinable

  • 如下三种情况的thread对象不是joinable
    1)默认构造的
    2)对象进行了移动(构建其他对象,或者赋值)
    3)已经调用了join和detach
bool joinable() const noexcept;

你可能感兴趣的:(C++ thread库)