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了

你可能感兴趣的:(c++)