44 C++ 进程线程的基本概念-并发,进程,线程,可执行程序的基本概念

一 并发,进程,线程的基本概念和综述

1 并发

两个或者更多的任务(独立的活动)同时发生,以提高性能

一个程序同时执行多个独立的任务。

在单核CPU的计算机上,某一个时刻只能执行一个任务,那么如何做到 一个 程序同时执行多个独立的任务呢?实际上是由操作系统调度,一个任务执行一段时间(这个时间一般比较短,ms为单位的,我们这里就假设是10ms),然后切换到另一个认为执行一段时间(这个时间当然也很短,假设是5ms),这样来来回回的在很短的时间内切换,给人们造成是多个认为在同时进行的错觉。这种模式我们叫做“任务切换”。任务切换来完成并发是有时间开销的。比如说:你一边听歌曲,一边打游戏。当CPU执行游戏的时候的,当时间到了的时候,要去执行播放歌曲,那么就需要将游戏当前的状态保存起来,然后等执行歌曲播放的时间到了的时候,又需要切换回游戏,这时候,就需要将游戏之前的状态恢复,这都是需要时间的。

对于多核CPU,是真的能实现并行执行对个任务的。但实际上任务数总是大于你CPU数量的,因此,也是 任务切换为主的。

2 可执行程序

是一个文件。

在windows一个扩展名为exe 的程序

在linux上 ,如果一个文件的属性是: rwxrwxrwx ,(x就代表着执行权限),在linux下,使用ls -la 列出文件属性 

3 进程

大家已经知道了可执行程序的概念了。

当这个可执行程序运行起来的时候,就创建了一个进程。

例如:我们点击了qq.exe,就有一个qq的进程了

如果这时候,我们再点击了qq.exe,就又有了一个qq的进程了。

运行起来的进程在windows 的任务遍历器中可以查看

4 线程

4.1.每个进程都有一个主线程,这个主线程是唯一的。

4.2.当你执行一个可执行程序时,产生一个进程后,这个主线程就随着这个进程默默的启动了

4.3.主线程执行的是从 main 函数中的代码,知道return 结束。

这句的意思是:主线程和进程是同生死的,一旦主线程结束,进程也就结束了。

4.4.线程可以理解为:一条代码的执行通路。主线程就是从main函数开始到return的这一条路。

4.5.除主线程外,其他线程都叫做子线程。子线程需要自己写代码创建。

4.6.每次创建一个新线程,就意味着可以在同一时刻,多干一个不同的事情(多走一条不同的代码执行路径)

4.7. 线程不是越多越好的,创建线程的最大数量一般在200到300之间(这个是经验)

二 并发的实现

1.多进程并发

以游戏服务器开发为例:

我们可以写一个账号服务器。

然后写一个专门的逻辑服务器。

然后写一个充值的服务器。

我们通过这三个服务器完成了整个游戏服务器的功能。

当然,这三个服务器有可能是需要通讯的。这就需要用到 进程间通讯 方案。

额外的知识点:进程间通讯有很多解决方法。在同一电脑了:有管道技术,文件技术,消息队列技术,共享内存技术。。不同电脑上,有socket技术等。

2.多线程并发

也就是在单个进程中,创建了多个进程。

每个线程都有自己独立的运行路径,但是一个进程中的所有线程共享地址空间。

这意味着:全局变量,全局指针,全局引用都可以在线程之间传递。

更深一层的意思是:多线程并发的开销 要 小于 多进程并发(因为少了进程间通讯技术的使用)。

也意味着:数据一致性可能有问题。例如a线程和b线程都要访问一块数据。因此引出了线程中的锁之类的概念,学习难度就大了。

3.总结

开发中 多线程并发 技术要优先于 多进程开发

后续我们说的 并发 都是指的 多线程开发

三 C++ 新标准线程库

在C++11之前,C++语言本身没有对多线程支持。

这意味着,对于windows 平台,调用createThread(),_beginthred(),这样windows 系统自己的创建thread的方法创建线程。

同理:对于linux平台,调用 pthread_create()这样linux系统自己的创建thread的方法创建线程

即使是 POSIX thread,这样的第三方的跨平台的 创建thread 的,也是需要配置一大堆参数的。(windows下配置windows 的,linux 下配置linux 的)

在C++11之后,C++11语言本身就support 了多线程,因此要弄明白这个,意味着从linux 平台移植到windows平台,或者鸿蒙 平台,都不需要再改动code了

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

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

相关文章

mac图片格式转换软件有哪些?推荐6个实用软件

mac图片格式转换软件有哪些?在数字时代,图片格式的转换已成为我们日常工作中不可或缺的一部分。对于Mac用户来说,选择一款高效、便捷的图片格式转换软件尤为重要。本文将为你介绍几款备受推崇的Mac图片格式转换软件,让你轻松应对各…

MySQL 5.7.35下载安装使用_忘记密码_远程授权

文章目录 MySQL 5.7.35下载安装使用_忘记密码_远程授权MySQL下载地址mysql安装点击安装,最好以管理员身份运行选择自定义安装选择64位勾选启动自定义产品执行点击同意点击下一步点击执行下一步配置数据库端口号设置登录密码,如果密码忘记,下面…

最新PyCharm安装详细教程及pycharm配置_pycharm安装教程

目录 一、PyCharm简介及其下载网站 二、单击网站的Downloads,进入二级页面,选择对应的操作系统下载PyCharm 三、PyCharm的安装程序的安装及其配置(configuration) 1、运行PyCharm Setup 2、安装位置设置 3、安装选项设置 4、开始菜单中PyCharm快捷方式的…

CMake入门教程【高级篇】管理MSVC编译器警告

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.什么是MSVC?2.常用的屏蔽警告3.MSVC所有警告4.target_compile_options用法5.如何在CMake中消除MSVC的警告?6.屏蔽警告编写技巧

Grafana Loki 日志传输工具

有各种不同的工具支持传输日志到Loki,有Grafana开发和第三方开发的工具。 Grafana 开发的工具: Grafana Agent Grafna 技术栈推荐客户端,支持收集度量、日志、跟踪和持续性能分析的遥测数据,跟Prometheus、OpenTelemetry、Graf…

Golang 四数相加 leetcode454 map哈希表

四数相加 leetcode454 本题如果直接进行四次for循环,则时间复杂度为O(N^4),超出运行时间限制。 因此我们这里使用两个分别的for循环进行遍历,则时间复杂度为O(N2N2). / 使用两遍for循环 func fourSumCount(nums1 []int, nums2 []int, nums3 []int, num…

MySQL自动备份脚本

MySQL自动备份脚本 mysqldump命令将数据库中的数据备份成一个文本文件,表的结构和数据将存储在生成的文本文件中 基本语法 备份一个数据库下的多个表 # 备份一个数据库下的多个表# username表示用户名# pwd表示密码# localhost为数据库地址# dbname表示数据库名称# …

如何使用css隐藏掉滚动条

1.解决方案 在滚动元素上再包裹一个父元素,然后,该元素添加如下代码: (注:PC端浏览器滚动条为8px)使元素偏移原来位置8px,目的就是将滚动条区域移动到父元素边框外面,然后&#xff…

PFA试剂瓶——实验室存储运输化学试剂样品容器

PFA是一种高性能的塑料材料。它是一种热塑性塑料,由全氟化,聚合物制成,具有高度的化学稳定性性。由于其优异的性能,PFA被广泛应用于多个领域,尤其是作为存储和运输各种化学试剂的容器,耐受-200℃至260C的温…

云流量回溯的工作原理及关键功能

云计算和网络技术的快速发展为企业提供了更灵活、高效的业务运营环境,同时也引发了一系列网络安全挑战。在这个背景下,云流量回溯成为网络安全领域的一个关键技术,为企业提供了对网络活动的深入洞察和实时响应的能力。 一、 云流量回溯的基本…

管理团队铁三角之责权利

一、前言 自从有了管理学之父德鲁克,管理的理论基本也可以被愿意学习学习的人学习的七七八八。没有理论的管理往往是实践摸索出来的,有的人管的好,有的人管的水平一般般。但是至于管理上的失败,没有多少管理者愿意承认是自己的责任,一般都是推卸给别人。博主在社会上混迹…

UTONMOS:探索元宇宙,开启未来游戏新篇章

在元宇宙的世界里,游戏不再只是消遣,而是一个全新的互动世界,等待你来探索! 逼真的虚拟现实技术,让你沉浸在充满想象力的游戏世界中,体验前所未有的刺激和乐趣。 与来自全球的玩家互动交流,结…

CodeWave智能开发平台--03--目标:应用创建--09供应商详情页面下

摘要 本文是网易数帆CodeWave智能开发平台系列的第13篇,主要介绍了基于CodeWave平台文档的新手入门进行学习,实现一个完整的应用,本文主要完成09供应商详情页面下主营产品展示及权限管理 CodeWave智能开发平台的13次接触 CodeWave参考资源…

国标28181平台的手机视频监控客户端的电子地图功能对比

目 录 一、手机客户端 1、概述 2、具体功能简述 二、电子地图功能 1、经纬度定位 2、附近设备 3、实时浏览功能 4、录像回放 5、缩放功能 三、手机web客户端和CS客户端上的电子地图功能对比 1、对比表 2、测距(PC客户端功能) 3…

2. Presto应用

该笔记来源于网络,仅用于搜索学习,不保证所有内容正确。文章目录 1、Presto安装使用2、事件分析3、漏斗分析4、漏斗分析UDAF开发开发UDF插件开发UDAF插件 5、漏斗测试 1、Presto安装使用 参考官方文档:https://prestodb.io/docs/current/ P…

52.介绍AOP有几种实现方式

52.介绍AOP有几种实现方式 Spring 1.2 基于接口的配置:最早的 Spring AOP 是完全基于几个接口的,想看源码的同学可以从这里起步。Spring 2.0 schema-based 配置:Spring 2.0 以后使用 XML 的方式来配置,使用 命名空间 <aop ></aop>Spring 2.0 @AspectJ 配置:使…

MySQL的三种存储引擎 InnoDB、MyISAM、Memory

InnoDB 1). 介绍 InnoDB是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在 MySQL 5.5 之后&#xff0c;InnoDB是默认的MySQL 存储引擎。 2). 特点 DML操作遵循ACID模型&#xff0c;支持事务&#xff1b; 行级锁&#xff0c;提高并发访问性能&#xff1b; 支持外键F…

LeetCode255.用队列实现栈

题目传送门&#xff1a;Leetcode255.用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压…

Python爬虫—requests模块简单应用

Python爬虫—requests模块简介 requests的作用与安装 作用&#xff1a;发送网络请求&#xff0c;返回响应数据 安装&#xff1a;pip install requests requests模块发送简单的get请求、获取响应 需求&#xff1a;通过requests向百度首页发送请求&#xff0c;获取百度首页的…

Visual Studio Code 连接远程服务器方法

1、输入用户名和服务器ip连接远程服务器 2、选择配置文件 配置文件路径&#xff1a;C:\Users\Administrator\.ssh\config config的内容大致如下&#xff1a; Host 192.168.134.3HostName 192.168.134.3User zhangshanHost 192.168.134.3HostName 192.168.134.3User lisiHost…