基本线程管理 join detach

join:主线程等待被join线程结束后,主线程才结束。

detach:主线程不等待被detach线程。

问题1:子线程什么时点开始执行?

std::thread t(fun);执行后,就开始执行了。

问题2:在哪里调用join或者detach

1,使用detach的话,直接在std::thread t(fun);后面加上t.detach()即可

2,使用join的话,就要自己选择在代码的哪个位置调用join。因为在子线程开始之后,但又在join被调用之前发生了异常,所以join的调用就没有实际发生。

解决方案1:使用try catch

void f(){std::thread t(my_func);try{do_some_work();      }catch{t.join();throw;}t.join();
}

解决方案2:使用一个类包装thread对象,在这个类的析构函数里调用join。

#include <iostream>
#include <thread>using namespace std;class my_thread{
public:explicit my_thread(thread& t_):t(t_){}~my_thread(){if(t.joinable()){ //  -------->①t.join();//  -------->②}}my_thread(my_thread const&) = delete;//  -------->③my_thread& operator=(const my_thread&) = delete;
private:thread& t;
};class func{
public:int& data;func(int& d):data(d){}void operator()(){cout << "thread started@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;for(unsigned j = 0; j < 100; ++j){cout << j << endl;}}
};int main(){int state = 0;func f(state);thread t(f);my_thread mt(t);//do_something_in_current_thread();
}//  -------->④

github源代码

知识点1:当程序执行到④处时,局部对象会被销毁,所以mt的析构函数就会被调用。即使在do_something_in_current_thread();处发生异常了,mt的析构函数也会被调用,所以,join函数不管在什么情况下都会被调用。

知识点2:在②处调用join前,必须要先判断是不是joinable①。这很重要,因为只能join一次,多次join就会出下面错误。

terminate called after throwing an instance of 'std::system_error'what():  Invalid argument
Aborted (core dumped)

知识点3:拷贝构造函数和赋值运算符被标记成delete了③,一确保它们不会被编译器自动提供。复制或赋值一个thread对象是很危险的,因为它可能比它要结合的线程的作用域存在更久。

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

转载于:https://www.cnblogs.com/xiaoshiwang/p/9752001.html

c/c++ 基本线程管理 join detach相关推荐

  1. [转]C++ 11 多线程--线程管理

    转载地址:https://www.cnblogs.com/wangguchangqing/p/6134635.html 说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并 ...

  2. C++ 11 多线程--线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  3. C++多线程并发中线程管理

    一.何为并发 刚开始接触计算机编程语言时,我们编写一个程序,在main入口函数中调用其它的函数,计算机按我们设定的调用逻辑来执行指令获得结果.如果我们想在程序中完成多个任务,可以将每个任务实现为一个函 ...

  4. 《线程管理:线程基本操作》

    目录 线程管理 启动线程与(不)等待线程完成 特殊情况下的等待(使用trycath或rall) 后台运行线程 线程管理 启动线程与(不)等待线程完成 提供的函数对象被复制到新的线程的存储空间中,函数对 ...

  5. C++11多线程----线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  6. C++11 多线程 线程管理基础

    线程管理基础 C++11 所有的线程都封装在<thread>头文件中,使用命名空间std说明. 最简单的例子: #include <iostream> #include < ...

  7. 《C++ Concurrencyin Action》第2章--线程管理

    前言 本章主要内容: 1 启动新线程 2 等待线程与分离线程 3 线程唯一标识符 好的!看来你已经决定使用多线程了.先做点什么呢?启动线程.结束线程,还是如何监管线程?在C++标准库中只需要管理std ...

  8. c++并发编程(concurrency)----线程管理

    c++并发编程(concurrency)----线程管理 启动线程,指定线程运行函数的多种方法 等待线程执行完毕 唯一辨别线程的方法 如果已经有兴趣启动多线程程序了,那么问自己个问题,如何启动多线程? ...

  9. c语言中的线程管理,深入解析C++编程中线程池的使用

    为什么需要线程池目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传 统多线程方案中我们采 ...

  10. Unix进程和线程管理及其异同

    Unix进程和线程管理及其异同 一,进程 1,什么是进程 在最初的单处理器系统中,系统中的多道程序按照一定规则切换而实现多任务处理,后来发现多个程序并发导致系统资源被共享,为了描述和管理程序对共享资源 ...

最新文章

  1. 读取raw目录中的文件数据
  2. 【知识图谱】人工智能技术最重要基础设施之一,知识图谱你该学习的东西
  3. 怎样查看mysql的安装路径
  4. setjmp与logjmp用法总结
  5. 我的『MVP.Blazor』快速创建与部署
  6. aix解锁oracle用户,aix用户被锁定的解决办法
  7. Mongoose 中使用 populate 实现关联查询
  8. hive - 自定义函数(超详细步骤,手把手的交)
  9. ios安装python的步骤_如何利用 Python 爬虫实现给微信群发新闻早报?(详细)
  10. windows下安装ubuntu16.04双系统的注意事项
  11. 「leetcode」1207. 独一无二的出现次数:【数组在哈希法中的经典应用】详解
  12. 深入浅出WPF(1)——什么是WPF
  13. 手机开机后android,手机开机后出现Android字样然后就自动关机了
  14. Excel用ListBox多选下拉带选择框
  15. 万亿级大数据监控平台建设实践
  16. JindoFS解析 - 云上大数据高性能数据湖存储方案
  17. c语言一个数平方表示,C语言 - 利用 汇编思想 写一个数的平方
  18. MAC版Sublime Text 解决 Unable to download XXX 问题
  19. ZZULIOJ:1141: 进制转换
  20. python怎么导入数据集keras_keras使用Sequence类调用大规模数据集进行训练的实现

热门文章

  1. matlab 算法转 c语言,matlab
  2. bootstart讲义,不过忘了是哪个老师的了
  3. 九、Linux 软件包安装
  4. 九、面向对象三大特征(三)—— 多态
  5. 聊聊我的 2018 年
  6. centos7永久修改主机名
  7. php中使用curl
  8. Linux非root用户如何使用80端口启动程序
  9. 创业篇——小老板的日常管理
  10. vue使用echarts错误Failed to mount component: template or render function not defined.