线程、进程、并发

本文深入解析了并发编程的基本概念,包括并发、进程、线程的区别与联系,探讨了多线程和多进程的实现方法及优缺点,介绍了线程创建过程与线程间的通信方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.并发
两个或者多个的任务(独立的活动)同时发生(进行)。
单核CUP下是没有并发的,单核CPU下所谓的“并发”是由操作系统调度,每秒钟进行多次所谓的“任务切换”。这种任务切换称为上下文切换,上下文切换是有时间开销的,比如操作系统要保存切换时的各种状态信息、执行进度,待切换回来的时候要知道原来的状态。

2.进程
在windows下运行起来的一个exe文件就是一个进程。
3.线程
线程其实就是用来执行代码的。
每个进程(即运行起来的可执行程序),都有一个主线程,这个主线程在当前进程中是唯一的,也就是一个进程中只能有一个主线程。当你执行可执行程序时会自动创建一个主线程。进程结束,主线程也就结束了
运行程序时,实际上是进程的主线程来执行(调用)这个main函数中的代码。

//主线程开始执行如下main()函数
main(){
   //....各种代码
return ;
//主线程执行完main中return后,表示整个进程运行完毕,此时主线程结束运行,这个进程也结束运行。

除了主线程外,也可以通过自己写代码创建其他线程,如果把线程理解成一个代码的执行通路或道路的话,自己创建的线程走的是别的道路。每创建一个新线程,就可以在同一个时刻,多干一个不同的事情(多走一条不同的代码执行路径)
线程不是越多越好,每个线程都需要一个独立的堆栈空间(1M大小),太多的线程占用内存,而且线程之间切换也是有时间消耗,线程太多,把时间都花费在线程切换上了,占用原本属于程序运行的时间。创建的线程最大数目不建议超过200-300个,有的时候线程太多反而会降低效率。
4.并发的实现方法
手段:1.通过多个进程实现并发;2.在单独的进程中,通过创建多个线程来实现并发,自己写代码创建除了主线程外的其他线程。
4.1多进程并发
word启动后是进程,excel启动后也是一个进程
进程之间的通信:(1)同一台电脑:管道,文件,消息队列,共享内存;
(2)不同电脑上:socket通信技术;
4.2多线程并发(单个进程中创建多个线程)
每个线程都有自己独立的运行路径,但是一个进程中的所有线程共享内存空间(如全局变量,指针,引用 都可以在线程之间传递)。共享内存带来新的问题:数据一致性问题,比如多个线程对某块内存数据的操作。平时使用多线程多于多进程
和进程相比,线程有如下优点:
(1)线程启动速度更快,更轻量级;(2)系统资源开销更小,执行速度更快,比如共享内存这种通信方式比任何其他的通信方式都快;
缺点:
(1)多线程使用起来有一定难度,要小心处理数据的一致性问题。
5.多线程
主线程从main()函数开始执行,那么我们自己创建的线程,也需要从一个函数开始运行(初始函数),一旦这个函数运行结束,该线程也就结束了,就像main函数运行结束,主线程就结束了。
而整个进程是否执行完毕的标志是主线程是否执行完,如果主线程执行完毕,就代表这个进程结束了。一般情况下如果主线程执行结束,而其他子线程还没有执行完毕,那么其他子线程也会被操作系统强行终止掉(但有例外)。
5.1多线程创建过程
(1)建立工程,将头文件thread包含进去
(2)创建thread类对象,
join()函数用于让主线程等待子线程执行完毕,防止出现主线程执行完毕时子线程还没有执行完毕,导致子线程被强制关闭。
detach()函数可以让主线程和子线程分别执行,可以在主线程结束后,子线程仍然可以执行,传统多线程程序中主线程要等待子线程执行完毕,然后主线程自己再最后退出。子线程使用detach()函数后,该子线程就失去与主线程的关联,这个子线程就会驻留在后台运行(主线程与该子线程失去联系),这个子线程就相当于被C++运行时库接管。当这个子线程执行完毕后,由运行时库负责清理该线程相关资源。但进程结束,子线程也就结束了
joinable()判断是否可以成功join()或者detach()的,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值