C++11中的多线程与异步

一、进程与线程

进程是应用程序的基本执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成进程在运行时创建的资源随着进程的终止而死亡。

线程是一个独立的执行流,是进程内部的一个独立的执行单元一个或多个线程构成一个进程,一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源但同时每个线程可以拥有自己的变量

 

二、多线程与异步操作

多线程就是指一个进程中同时有多个线程正在执行。相比于多进程,多线程花销小切换快同时线程间通信更加方便,因此一般将耗时的操作置于一个新的线程但是应当注意的是,线程间的共享变量可能会造成死锁。

异步操作的主要目的是让调用方法的主线程不需要同步等待调用函数从而可以让主线程继续执行它下面的代码因此异步操作无须额外的线程负担,使用回调的方式进行处理在设计良好的情况下,处理函数可以不必或者减少使用共享变量减少了死锁的可能当需要执行I/O操作时,使用异步操作比使用线程+同步 I/O操作更合适。

异步和多线程并不一个同等关系异步是目的多线程是实现异步的一个手段实现异步可以采用多线程或交给另外的进程来处理

 

三、并发与并行

多线程其实是实现并发(并行)的一种手段。

并发在一个时间段内执行多个操作。

并行是指两个或多个独立的操作同时进行

在单核时代,多个线程是并发的,在一个时间段内轮流执行CPU核心数和线程数并不是对应的,并不是单核CPU就只能执行一个线程。线程是操作系统模拟出来的概念,通过系统的调度算法实现“并行”运行让这个线程跑一会,再让那个线程跑一会。

在多核时代,多个线程可以实现真正的并行,在多核上真正独立的并行执行。例如现在常见的4核4线程可以并行4个线程;4核8线程则使用了超线程技术,把一个物理核模拟为2个逻辑核心,可以并行8个线程。

 

四、并发编程的方法

1.多进程并发

多进程并发是将一个应用程序划分为多个独立的进程(每个进程只有一个线程),这些独立的进程间可以互相通信,共同完成任务。由于操作系统对进程提供了大量的保护机制,以避免一个进程修改了另一个进程的数据,使用多进程比多线程更容易写出安全的代码。但这也造就了多进程并发的两个缺点:

a.进程间的通信,无论是使用信号、套接字,还是文件、管道等方式,其使用要么比较复杂,要么速度较慢,或者两者兼而有之。

b.运行多个进程的开销很大,操作系统要分配很多的资源来对这些进程进行管理。

由于多个进程并发完成同一个任务时,不可避免的是:操作同一个数据和进程间的相互通信,上述的两个缺点也就决定了多进程的并发不是一个好的选择。

 

2.多线程并发

多线程并发指在同一个进程中执行多个线程。线程是轻量级的进程,每个线程可以独立的运行不同的指令序列,但是线程不独立拥有资源,依赖于创建它的进程而存在。也就是说,同一进程中的多个线程共享相同的地址空间,可以访问进程中的大部分数据,指针和引用可以在线程间进行传递。这样,同一进程内的多个线程能够很方便的进行数据共享以及通信,也就比进程更适用于并发操作。由于缺少操作系统提供的保护机制,在多线程共享数据及通信时,就需要做更多工作以保证对共享数据段的操作是以预想的操作顺序进行的,并且要极力的避免死锁

 

五、多线程与高并发

高并发指系统运行过程中短时间内遇到大量操作请求的情况主要发生在web系统集中大量访问或者socket端口集中收到大量请求(如12306抢票双十一活动等)。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅降低用户体验(请求响应时间过长),同时可能导致系统宕机,系统停止工作等。如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等。

而多线程只是在同/异步角度上解决高并发问题的一个方法手段,是在同一时刻利用计算机闲置资源的一种方式。多线程在高并发问题中的作用就是充分利用计算机资源,达到最大的利用率,不浪费资源使其闲置。

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值