您的位置:首页 > 编程语言 > C语言/C++

c++并发探索1-线程基本管理

2017-01-21 00:20 197 查看

一、创建线程

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_))
{
}
4000
thread_guard(std::thread const & t_) = delete;

//析构前必须显示等待线程完成join或者分离detach
~thread_guard()
{
if(t.joinable())
t.join()
}
}


线程数量

创建线程数量<=cpu核心数(std::hardware_concurrency()),就可以为每个线程单独分配一个cpu核心。减少线程切换带来的性能损耗。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 并发 多线程 RAII