c/c++ 基本线程管理 join detach
基本线程管理 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相关推荐
- [转]C++ 11 多线程--线程管理
转载地址:https://www.cnblogs.com/wangguchangqing/p/6134635.html 说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并 ...
- C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- C++多线程并发中线程管理
一.何为并发 刚开始接触计算机编程语言时,我们编写一个程序,在main入口函数中调用其它的函数,计算机按我们设定的调用逻辑来执行指令获得结果.如果我们想在程序中完成多个任务,可以将每个任务实现为一个函 ...
- 《线程管理:线程基本操作》
目录 线程管理 启动线程与(不)等待线程完成 特殊情况下的等待(使用trycath或rall) 后台运行线程 线程管理 启动线程与(不)等待线程完成 提供的函数对象被复制到新的线程的存储空间中,函数对 ...
- C++11多线程----线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- C++11 多线程 线程管理基础
线程管理基础 C++11 所有的线程都封装在<thread>头文件中,使用命名空间std说明. 最简单的例子: #include <iostream> #include < ...
- 《C++ Concurrencyin Action》第2章--线程管理
前言 本章主要内容: 1 启动新线程 2 等待线程与分离线程 3 线程唯一标识符 好的!看来你已经决定使用多线程了.先做点什么呢?启动线程.结束线程,还是如何监管线程?在C++标准库中只需要管理std ...
- c++并发编程(concurrency)----线程管理
c++并发编程(concurrency)----线程管理 启动线程,指定线程运行函数的多种方法 等待线程执行完毕 唯一辨别线程的方法 如果已经有兴趣启动多线程程序了,那么问自己个问题,如何启动多线程? ...
- c语言中的线程管理,深入解析C++编程中线程池的使用
为什么需要线程池目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短. 传 统多线程方案中我们采 ...
- Unix进程和线程管理及其异同
Unix进程和线程管理及其异同 一,进程 1,什么是进程 在最初的单处理器系统中,系统中的多道程序按照一定规则切换而实现多任务处理,后来发现多个程序并发导致系统资源被共享,为了描述和管理程序对共享资源 ...
最新文章
- 读取raw目录中的文件数据
- 【知识图谱】人工智能技术最重要基础设施之一,知识图谱你该学习的东西
- 怎样查看mysql的安装路径
- setjmp与logjmp用法总结
- 我的『MVP.Blazor』快速创建与部署
- aix解锁oracle用户,aix用户被锁定的解决办法
- Mongoose 中使用 populate 实现关联查询
- hive - 自定义函数(超详细步骤,手把手的交)
- ios安装python的步骤_如何利用 Python 爬虫实现给微信群发新闻早报?(详细)
- windows下安装ubuntu16.04双系统的注意事项
- 「leetcode」1207. 独一无二的出现次数:【数组在哈希法中的经典应用】详解
- 深入浅出WPF(1)——什么是WPF
- 手机开机后android,手机开机后出现Android字样然后就自动关机了
- Excel用ListBox多选下拉带选择框
- 万亿级大数据监控平台建设实践
- JindoFS解析 - 云上大数据高性能数据湖存储方案
- c语言一个数平方表示,C语言 - 利用 汇编思想 写一个数的平方
- MAC版Sublime Text 解决 Unable to download XXX 问题
- ZZULIOJ:1141: 进制转换
- python怎么导入数据集keras_keras使用Sequence类调用大规模数据集进行训练的实现