程序运行起来,会生成一个进程,该进程所属的主线程开始自动运行
    主线程从main()开始执行,自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行完毕,就代表线程结束。
    整个进程是否执行完毕的标志是,主线程是否执行完,如果其它子线程还没有执行完毕,一般情况下那么这些子线程也会被强行终止。

    一个书写良好的程序,应该是主线程等待子线程执行完毕后,自己才能最终退出
    一般主线程是用来线程调度的,不执行操作。
    传统多线程程序主线程要等待子线程执行完毕,然后再自己退出
    detach:分离,也就是主线程不和子线程汇合
    为什么引入detach():我们创建了很多子线程,让主线程逐个等待子线程结束,这种编程方法不太好,所以引入了detach()。 一旦detach后,与这个主线程关联的thread对象就会失去与这个主线程的关联,这个子线程相当于被C++运行时刻接管了,当这个子线程执行完成后,由运行时库负责清理该线程相关的资源(守护线程)。

    joinable():判断是否可以成功使用join()或者detach()的

    1. #include<iostream>
    2. #include<thread>
    3. #include<unordered_map>
    4. using namespace std;
    5. int aa = 0;
    6. //自己创建的线程也要从一个函数开始
    7. void myPrint()
    8. {
    9. aa = 11;
    10. }
    11. int main()
    12. {
    13. int i = 99;
    14. //创建一个线程
    15. thread myThreat(myPrint);
    16. //阻塞主线程,让主线程等待子线程执行完毕,然后子线程和主线程汇合,然后主线程再往下走
    17. myThreat.detach();
    18. cout << aa << endl;
    19. //myThreat.join();
    20. return 0;
    21. }