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


一、创建线程

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核心。减少线程切换带来的性能损耗。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值