IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【C++多线程】1.1线程的创建 -> 正文阅读

[Java知识库]【C++多线程】1.1线程的创建

创建线程(thread)分析程序报错原因

头文件:include<thread>

理解线程的创建运行过程

你可以试着运行下面这段代码,你会发现,他肯定会报错!

#include<thread>
#include<iostream>

void task(){
    std::cout<<"线程运行开始"
}
int main(){
    std::thread th1(task);
}

为什么会报错?

Java里的多线程,创建好线程后,需要调用 run 或者 start 方法来启动这个线程。而 C++ 里的 thread 不需要这个过程,直接传值创建这个线程的内存后,会自动的开始运行这个线程(应该是利用的RAII特性在构造函数里面运行了这个线程的代码)。

但上面并不是报错的理由,在Java里面,线程创建之后会自动和主线程形成联系,start方法开始运行后,这个子线程会和主线程的生命周期一致,如果子线程后于主线程结束,那么就会阻塞主线程直到子线程结束才终止整个程序。当然也可以把子线程通过 setDaemon(true) 设置后,使得主线程和子线程直接的关系切断,这样主线程就不会再等待子线程了,这样就形成了守护线程。

好了,现在回归到上面的C++代码,说说为什么会发生错误。

同样,在C++里创建线程后,也会和主线程产生联系,但它并不会像Java一样主线程自动的等待子线程结束,这个等待结束的过程需要你自己去调用这个线程对应的方法。如果不去调用方法等待子线程结束,或者切断他们之间的联系,那程序就会Crash。这就是报错的原因了!

解决报错的方式:join()和detach

为了解决上面的报错问题有两种方式解决。

方法一:调用join()方法进行合并

由于主线程和子线程之间有联系,我们如果需要正常执行完这个程序,则需要保证整个线程一并结束或者是切断联系。

join() 方法的调用就是等待子线程和主线程汇聚,产生的效果就是主线程被阻塞,直到子线程结束运行,阻塞停止。

join在这里是汇聚汇集之意,你可以想象有多根线,最终结束的时候这几根线需要汇聚到一起,然后全部的线程就结束了,整个程序正常退出!

代码如下:就仅仅在最后加入了一行join代码,程序bug被解决!

#include<thread>
#include<iostream>

void task(){
    std::cout<<"线程运行开始";
}
int main(){
    std::thread th1(task);
    th1.join();
}

方法二:调用detach()方法分离线程联系

前面也讲到,由于主线程和子线程之间的联系,导致主线程需要照顾子线程。那么detach方法的调用就是切断这个联系。调用了这个方法后,主线程不会再等待子线程执行结束,而是直接正常结束,而子线程是否执行完成和我主线程没有任何关系了。

调用这个方法后的线程,可以理解为守护线程了。这种情况下内存安全要引起重视,如果子线程用到了主线程的资源,这个情况下将会导致 指针悬空 这是一个非常严重的内存安全问题!

代码如下:

#include<thread>
#include<iostream>

void task(){
    std::cout<<"线程运行开始";
}
int main(){
    std::thread th1(task);
    th1.detach();
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 15:57:54  更:2022-03-03 15:58:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:06:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码