1.介绍
  std::thread是C++11新加的一个跨平台的一个C++线程库(pthread不跨平台)。很方便地支持了并发编程。

2.特性
2.1 std::thread成员函数没有start函数,创建一个对象就表明启动了start函数

2.2 join函数是等待线程完成其执行,就是要让它的父线程等待该线程执行完结束,父线程再退出结束。如下代码:

#include <iostream>
#include <memory>
#include <string>
#include <thread>
using namespace std;

void func1()
{
    std::cout << "func1" << std::endl;
}

void func2()
{
    std::cout << "func2" << std::endl;
}

int main()
{
    std::thread t1(func1);
    std::thread t2(func2);
    std::cout << "main" << std::endl;
    return 0;
}

是非常有可能抛出异常的代码,因为可能主函数的线程退出了,t1或者t2的线程没有执行完。如下代码就会正确执行了:
图片说明

2.3 detach函数容许线程从线程句柄独立开来执行,即相当于网络游戏断开了网络,在本地单机运行,这个线程对象detach之后就在后台默默运行了,与之父线程无关了。detach之后也不能通过join来让父线程等待线程执行完了,无法控制线程何时执行完。

2.4 创建的线程对象不能拷贝,但是可以通过std::move移动,好像std::unique_ptr也是不能拷贝,可以通过std::move移动。代码如下:
图片说明
会报错,注释掉t1.join()就好了。

2.5 可以通过std::bind或者lambda表达式来创建线程,代码如下:
图片说明