一、创建线程
1.建立可调用对象
2.创建thread对象并关联可调用对象
#include <iostream>
#include <thread>
using namespace std;
class background_task
{
public:
void operator()()const
{
cout<<this_thread::get_id()<<endl;
}
};
int main()
{
//注意这里的临时对象创建使用了括号;
//避免被解释为函数声明
//或者,使用c++11语法{}
//thread task{background_task()}
thread task( (background_task() ));
task.join();//task线程与main线程连接
}
二、线程基本管理
函数运行可以join(链接)、detach(分离)
1.join:阻塞在task.join()处,直到task结束返回
2.detach:函数从task.detach()处与主线程完全分离,并且不能再次join.此时如果main函数结束,程序退出,则分离的线程强制结束。
三、异常情况下退出
异常情况:在线程创建后,join()调用之前,程序发生异常。则join()不能被调用。
处理:RAII原则 Resources Acquization Is Initialization
//thread对象是可移动,不可复制 {p23}
//移动复制=,移动初始化均可
class thread_guard
{
explicit thread_guard(std::thread & t_):t(std::move(t_))
{
}
thread_guard(std::thread const & t_) = delete;
//析构前必须显示等待线程完成join或者分离detach
~thread_guard()
{
if(t.joinable())
t.join()
}
}
线程数量
创建线程数量<=cpu核心数(std::hardware_concurrency()),就可以为每个线程单独分配一个cpu核心。减少线程切换带来的性能损耗。