参考cplusplus
参考cppreference
0.线程的基础知识
0.1 线程的状态
0.2 c++线程的joinable和detached状态
- joinable
一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。
- detached
一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
0.3 两种等待线程结束的方式
- 当线程启动后,一定要在和线程相关联的thread销毁前,确定以何种方式等待线程执行结束。
1)detach方式,启动的线程自主在后台运行,当前的代码继续往下执行,不等待新线程结束。
2)join方式,等待启动的线程完成,才会继续往下执行。
1.构造函数
- 注意第二个构造函数:
新产生的线程会调用fn函数,该函数的参数由args给出。
template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);
2.赋值操作
// move (1)
thread& operator= (thread&& rhs) noexcept;
// copy [deleted] (2)
thread& operator= (const thread&) = delete;
// example for thread::operator=
#include <iostream> // std::cout
#include <thread> // std::thread, std::this_thread::sleep_for
#include <chrono> // 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;