并发与多线程(一)_______并发基本概念及其实现,进程,线程基本概念

目录

(1)并发,进程,线程的基本概念和综述

        (1.1)并发

        (1.2)可执行程序

        (1.3)进程

        (1.4)线程

(2)并发的实现方法

        (2.1)多进程并发

        (2.2)多线程并发

        (2.3)总结

(3)C++新标准线程

本笔记是自我学习版,可能会不严谨,也可能会有所漏洞,往大家多多包涵,多多指点。

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

(1.1)并发

两个或者更多的任务,独立的活动同时发生(进行),一个程序独立执行多个任务,就比如你边走路边说话,这就是并发。

以往计算机,它只有一个CPU(中央处理器),某一时刻,它只能处理单个任务,要想执行多个任务:由操作系统调动,每秒钟进行所谓的任务切换,比如说我一个单核处理器要处理是个任务,每个任务分配十毫秒,第一个任务完成十毫秒后快速切换第二个任务,保留上一个任务的状态,以此类推,第十个任务后再切回第一个任务,因为切的比较快,所以达成了一个伪同时进行,达到了一个并发的假象,这种切换也叫“上下文切换”。大家也可以想到,这种切换会有时间开销,比如操作系统会保存你切换时的各种状态,执行进度等信息,都需要时间,切换回来的时候要复原这些信息。

随着硬件的发展,出现了多处理器计算机(服务器和高性能计算领域),台式机笔记本(多个)CPU核,四核六核八核,它们就可以实行真正的并行执行任务(硬件并发),任务数可以在任务管理器中看见。

使用并发的原因:可以同时执行多个任务,效率与性能大大的提高。

(1.2)可执行程序

磁盘上的一个执行文件,windows下,一个扩展名为.exe的,点击就可以运行,linux中,权限ls列表 -la列表的时候,有一个rwxrwxrwx(带x的就是执行权限,有这种权限的程序一般就可以执行)。

(1.3)进程

已经知道了可执行程序是可以运行的,windows下双击可执行程序就可以运行,linux中./文件名就可以运行起来。

进程就是一个可执行程序运行起来,可执行程序运行起来,就是创建了一个进程。进程就是运行起来的可执行程序

(1.4)线程

每个进程(执行起来的可执行文件),都有一个主线程,这个主线程是唯一的,每个进程中只有一个主线程,当执行可执行程序后,主线程就默默的启动起来了,两者唇齿相依的关系,在代码测试中,ctrl+F5实际上是主线程来执行(调动)代码;实际上线程就是用来执行代码的,可以理解为代码的执行通路(道路),除了主线程以外,我们可以通过代码来创建其它线程,其它线程走的是其它别的地方,甚至通往不同的地方,每创建一个一个新线程,就可以多干一个不同的事(多走一条代码)执行的路径。

多线程(并发),线程不是越多越好,每个线程需要一个独立的空间(1M),线程之间还要进行切换,而切换会出现代价,上下文切换,需要保存多个状态,太多会占用内存,还会占用大量的时间来切换,会耗费本该程序运行的时间,整个程序效率没有变高,反而降低了。

假如我们有一个游戏服务器,还有一个充值服务器,四个用户,第一个用户要充值,发送给游戏服务器,游戏服务器接受请求后还要发送给充值服务器,而这时,用户二要抽卡,用户三要卖装备.......这时就可以利用线程来解决,多个线程处理不同的问题和请求,充钱会比较慢,其它的请求很快,及时玩家过多,也不怎么影响其它用户。

线程开发有一定难度,实现代码难度高,理解上需要时间,需要一定学习时间。

并发的实现方法

两个或多个任务(独立活动)同时进行,我们通过多个进程实现并发,我们也可以实现多个线程来实现并发,自己写代码来创建除了主线程以外的其它多个线程来实现并发。

(2.1)多进程并发

当我们启动一个游戏,可能会启动多个服务器服务,例如游戏账号服务器,游戏逻辑服务器,启动游戏后,它们两个(服务器进程)有可能会出现通讯,进程之间的通讯(同一个电脑上:管道,文件,消息队列,共享内存),如果不在同一个电脑上,可以用cocked通讯技术;来实现两个不在同一个电脑上的进程之间的通讯。

(2.2)多线程并发

单个进程,创建了多个线程,感觉像个轻量级的进程,每个线程都有独立的运行路径,但是一个进程中的所有线程都是共享内存的(共享地址空间)(全局变量,指针,引用都可以在线程中传递);使用多线程开销远小于多进程,

多线程共享内存虽然灵活,但是也会带来一系列问题,数据一致性问题,比如有两个线程,分别是线程A和线程B,它俩如果同时往一个地方写数据,就需要考虑先后问题,不能同时写,如果那样就会发生数据覆盖。

多进程并发和多线程并发虽然可以混合使用,但是优先考虑多线程手段而不是多进程,特殊情况特殊考虑。

总结

和进程相比,线程有如下优点:

1.线程启动更快速,更轻量级

2.系统资源开销少,执行速度更快,比如共享内存, 比任何其他通信方式都快

缺点:

1.使用起来比较困难,要考虑数据一致性问题

C++新标准线程库

windows: 

CreateThread( );    _beginthred( );   _beginthredexe( )    //创建线程

linux:

pthread_create( );  //创建线程

临界区,互斥量等等新概念;以往多线程不能跨平台,其中POSIX thread(pthread)库是可以跨平台的,但是为了支持这个库,需要一定的配置,用起来也不是非常方便,从C++11新标准后,C++语言本身增加了多线程支持,我们就可以用C++本身来编写多线程。意味着可移植性,这就是跨平台大大减少工作量。

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九离十

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值