C++中的主线程、子线程

        在C++中,线程是并发执行的最小单位。主线程(main thread)通常是一个程序开始执行时系统自动创建的线程,而子线程(child thread或worker thread)则是由主线程或其他子线程创建的线程。

并发执行,又称并发处理,是指计算机同时处理多个任务的能力。这里的“同时”可能是字面意义上的同时(如在多核或多处理器的系统中),也可能是看似同时,实则在一颗单核CPU上,通过快速切换上下文使得任务看起来是在同时执行。

在操作系统中,通过线程和进程的调度实现并发执行。线程或进程会被操作系统分配CPU时间片,然后在每个时间片上执行。当时间片结束时,当前线程或进程会被暂停,另一个线程或进程会被唤醒继续执行。这样通过快速切换,可以让用户感觉到所有线程或进程都在同时运行,这就是并发执行。

并发执行的主要优点是能够提高系统的响应性和吞吐量。例如,一个Web服务器就需要并发处理大量的用户请求。在一些高性能计算的应用中,比如图像处理、科学计算等,也需要并发执行来提高计算效率。然而,编写和调试并发程序相比单线程程序来说会更复杂,主要原因是需要处理线程或进程间的同步和通信问题,比如数据的竞态条件、死锁等。

        主线程:这是由操作系统创建并启动的线程,它通常负责执行程序的主要任务。它也是程序的入口点,当你的程序开始运行时,它就会开始执行。

所谓的"主线程"main,其入口代码是类似这样的方式调用main的:exit(main(...))

main执行完之后, 会调用exit()

exit() 会让整个进程over终止,那所有线程自然都会退出

        子线程:这些线程是在程序运行期间由主线程或其他子线程创建的。子线程可以与主线程并行执行,这对于需要同时处理多个任务的情况非常有用。

当你创建一个子线程时,你需要给定一个函数或方法,该线程将从该函数开始执行。子线程会独立于创建它的线程运行,同时还可以访问共享数据。

然而,子线程的生命周期不受创建它的线程控制。也就是说,即使创建子线程的线程已经终止(比如主线程已经结束),子线程仍然可以继续运行,除非整个进程都被终止。在C++中,如果主线程在子线程之前结束并调用了exit(),那么整个进程(包括所有的子线程)都会被终止。

例如,以下是一个创建并等待子线程完成的例子:

#include <iostream>
#include <thread>// 子线程要运行的函数
void child_function() {for (int i = 0; i < 5; ++i) {std::cout << "Child thread: " << i << std::endl;}
}int main() {// 创建并启动子线程std::thread child_thread(child_function);// 在主线程中做一些事情for (int i = 0; i < 5; ++i) {std::cout << "Main thread: " << i << std::endl;}// 等待子线程完成child_thread.join();return 0;
}

        在这个例子中,主线程创建并启动了一个子线程,并等待子线程完成执行。主线程和子线程并发执行,并且都可以访问std::cout进行输出。然而,如果没有正确的同步机制,多个线程同时写入同一资源可能会导致数据竞争。

 这里有一个C++中使用线程的例子:

#include <iostream>
#include <thread>void function_1() {std::cout << "Function 1 is called from a child thread" << std::endl;
}int main() {std::cout << "Main thread starts" << std::endl;// 创建一个子线程,执行function_1std::thread thread_1(function_1);// 等待子线程结束thread_1.join();std::cout << "Main thread ends" << std::endl;return 0;
}

        在这个例子中,主线程开始执行,然后创建一个子线程来执行function_1。主线程会等待子线程执行完毕,然后继续执行,最后结束。每个线程都独立执行,具有自己的指令指针和一组寄存器等。

        这是一个基础的线程使用例子,实际应用中可能会涉及到更多的问题,比如线程之间的同步、互斥,线程的调度等。所以在使用多线程时,我们需要更深入地了解和熟悉线程的特性和相关的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/13852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ORBSLAM2第一阶段跟踪课后习题

不定项选择题 (2分) 阅读TrackReferenceKeyFrame()函数&#xff0c;以下说法[错误]的是? A.该函数是地图初始化完成后&#xff0c;第一个使用的跟踪方式 B.该函数中使用词袋&#xff0c;目的是可以加快当前顿与参考帧之间的特征点匹配速度C.BA优化中同时优化了位姿和地图点 D.…

kafka:消费者从指定时间的偏移开始消费(二)

我的前一篇博客《kafka:AdminClient获取指定主题的所有消费者的消费偏移(一)》为了忽略忽略掉上线之前的所有消息&#xff0c;从获取指定主题的所有消费者的消费偏移并计算出最大偏移来解决此问题。 但这个方案需要使用不常用的AdminClient类&#xff0c;而且如果该主题如果是第…

Python的输入:探索不同的输入方法和技巧

Python的输入&#xff1a;探索不同的输入方法和技巧 引言 1.1 Python的输入概述 在编程中&#xff0c;输入是一个非常重要的概念。它允许我们从用户、文件或其他程序中获取数据&#xff0c;以便进行处理、计算或展示。Python提供了多种方法来获取输入&#xff0c;每种方法都…

SpringBoot中的RestTemplate使用笔记

SpringBoot中的RestTemplate使用笔记 为了方便使用&#xff0c;这里我封装成一个工具类来静态调用RestTemplate以下代码是基于SpringBoot2.4.2版本写的案例 需要配置的application.yml如下 server:port: 7024servlet:context-path: /demosession:timeout: 30m #默认会话过期…

redis分布式锁

Redis 作者继续论述&#xff0c;如果对方认为&#xff0c;发生网络延迟、进程 GC 是在步骤 3 之后&#xff0c;也就是客户端确认拿到了锁&#xff0c;去操作共享资源的途中发生了问题&#xff0c;导致锁失效&#xff0c;那这不止是 Redlock 的问题&#xff0c;任何其它锁服务例…

数据库面试题

Mysql篇 &#xff08;1&#xff09;请你解释下mysql主从同步中的&#xff0c;全同步&#xff0c;异步&#xff0c;以及半同步的三种模式概念? 此题是XX想面试题。 MySQL默认的复制即是异步的&#xff1a; 主库在执行完客户端提交的事务后会立即将结果返给客户端&#xff0c…

Flowable-任务-脚本任务

定义 脚本任务&#xff08;Script Task&#xff09;是一种自动执行的活动。当流程执行到达脚本任务时&#xff0c;会执行相应的 脚本&#xff0c;完毕后继续执行后继路线。脚本任务无须人为参与&#xff0c;可以通过定义脚本实现自定义的业务逻辑。 图形标记 脚本任务显示为…

数据结构基础:3.单链表的实现。

单链表的介绍和实现 一.基本概念1.基本结构2.结构体节点的定义&#xff1a; 二.功能接口的实现0.第一个节点&#xff1a;plist1打印链表2创建一个节点3.头插4.头删5.尾插6.尾删7.查找8.在pos之前插入x9.在pos之后插入x10.删除pos位置11.删除pos的后一个位置12.链表释放 三.整体…

UE4/5C++多线程插件制作(二十、源码)

目录 头文件 MultiThreadPlugins.uplugin MultiThreadPlugins.Build.cs MultiThreadPlugins.h MTPPlatform.h MTPManage.h RTPAgendy.h MTPThreadTaskManage.h

C语言每天一练----输出水仙花数

题目&#xff1a;请输出所有的"水仙花数" 题解&#xff1a;所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。 例如, 153是水仙花数, 因为153 1 * 1 * 1 5 * 5 * 5 3 * 3 * 3" #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h&g…

【自动化运维】Ansible常见模块的运用

目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1&#xff0e;command 模块3.2&#xff0e;shell 模块3.3&#xff0e;cron 模块3.4&#xff0e;user 模块3.5&#xff0e;group 模块3.6&#xff0e;copy 模块3.7&#xff0e;file 模块8&#xff…

【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU

早上百度搜“神经网络KPU”&#xff0c;查到与非网的一篇文章《一文读懂APU/BPU/CPU/DPU/EPU/FPU/GPU等处理器》&#xff0c;介绍各种处理器非常详细&#xff0c;关于“KPU”的内容如下&#xff1a; KPU Knowledge Processing Unit。 嘉楠耘智&#xff08;canaan&#xff09;号…

k8s证书更新,kubeadm安装的K8S证书过期后无法使用后证书更新方法

k8s证书更新 1. 查看证书过期时间 #通过文件查看证书过期时间 for item in find /etc/kubernetes/pki -maxdepth 2 -name "*.crt";do openssl x509 -in $item -text -noout| grep Not;echo $item;done #通过命令查看证书过期时间 kubeadm certs check-expirationk8…

找不到mfc140u.dll怎么解决

第一&#xff1a;mfc140u.dll有什么用途&#xff1f; mfc140u.dll是Windows操作系统中的一个动态链接库文件&#xff0c;它是Microsoft Foundation Class (MFC)库的一部分。MFC是 C中的一个框架&#xff0c;用于构建Windows应用程序的用户界面和功能。mfc140u.dll包含了MFC库中…

杂谈项——关于我在bw上的见闻,以及个人对二次元游戏行业方面的前瞻

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天为大家带来一点不一样的&#xff0c;首先先光速叠一下甲&#xff1a; 在此说明博主并不是一个什么都知道的大佬&#xff0c;只是一个普通的老二次元以及期望以后能…

HCIP重发布实验

目录 实验要求&#xff1a; 步骤一&#xff1a;拓扑设计IP地址规划 拓扑设计 R1 R2 R3 R4 发布路由 R1 R2 R3 R4 双向重发布 在R2和R4 上进行 R2 R4 检查R1 修改开销值选路 择优选择去4.0网段的路径 测试&#xff1a;​编辑 择优选择去32网段的路径 测试&…

【uniapp 获取缓存及清除缓存】

小程序及H5 获取缓存&#xff1a; 使用uniapp中的wx.getStorageInfoSync()方法可以获取当前小程序或H5应用的本地缓存信息&#xff0c;如下所示&#xff1a; let storageInfo uni.getStorageInfoSync() console.log(storageInfo)其中&#xff0c;storageInfo是一个对象&…

短视频矩阵源码/系统搭建/源码

一、短视频矩阵系统开发需要具备以下能力 短视频技术能力&#xff1a;开发人员应具备短视频相关技术能力&#xff0c;如视频编解码、视频流媒体传输等。 大数据存储和处理能力&#xff1a;短视频矩阵系统需要处理大量的视频数据&#xff0c;因此需要具备大数据存储和处理的能力…

JavaScript快速入门:ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器

JavaScript快速入门&#xff1a;ComPDFKit PDF SDK 快速构建 Web端 PDF阅读器 在当今丰富的网络环境中&#xff0c;处理 PDF 文档已成为企业和开发人员的必需品。ComPDFKit 是一款支持 Web 平台并且功能强大的 PDF SDK&#xff0c;开发人员可以利用它创建 PDF 查看器和编辑器&…

初探webAssembly | 京东物流技术团队

1 WebAssembly是什么&#xff1f; 一种运行在现代网络浏览器中的新型代码&#xff0c;并且提供新的性能特性和效果 W3C WebAssembly Community Group开发的一项网络标准&#xff0c;对于浏览器而言&#xff0c;WebAssembly 提供了一条途径&#xff0c;让各种语言编写的代码以接…