【C++】多线程编程一(初识并发和多线程)

目录

一、并发和并行的概念

1.并发

2.并行

3.并发和并行的区别

二、并发的途径

多进程并发

多线程并发

 三、C++11相关多线程编程的头文件


一、并发和并行的概念

1.并发

 并发:指同一时刻只能有一条指令执行,但是多个进程指令被快速地轮换执行,使得在宏观上具有多个进程同时执行的效果,但实际在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。

2.并行

并行:指同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观看,都是同时执行。

3.并发和并行的区别

解释一:并行是两个或多个事件在同一时刻发生;并发是指两个或多个事件在同一时间间隔发生。

解释二:并行是在不同实体上的多个事件;并发是在同一实体上的多个事件。

解释三:并行是在多台处理器上同时处理多个任务;并发是在一台处理器上同时处理多个任务。

并发编程目标就是充分地利用处理器地每一个核,以达到最高地处理性能。


二、并发的途径

  • 多进程并发

多进程并发是将应用程序分为多个独立的进程,它们在同一时刻运行(例如:同时进行网页浏览和文字处理)。独立的进程可以通过进程间常规通信渠道进行信息交换(信号、套接字、文件、管道等)。进程间的通信比较简单,但是速度慢,因为操作系统会在进程间提供一定的保护措施,以避免一个进程去修改另一个进程的数据(这些保护操作意味着可以编写更安全的并发代码)。运行多个进程需要时空开销:启动进程需要时间,操作系统内部资源来管理进程。

多进程并发的独特优势——可以使用远程连接,在不同的机器上运行独立的进程。

  • 多线程并发

多线程并发是在单个进程中运行多个线程。每个线程相互独立运行,且线程可以在不同的指令序列中运行。进程中的所有线程都共享地址空间,并且所有线程访问到的大部分数据——全局变量仍然是全局的,指针、对象的引用或数据可以在线程间传递。进程间通常共享内存,但是这种共享通常难以建立和管理。因为同一数据的内存地址在不同的进程中是不同的。

 多线程地址空间共享,缺少线程间数据的保护,使得操作系统的记录工作量减少,所有多线程的开销要远小于使用多进程。共享内存的使用同时也带来了线程安全问题:如果数据要被多个线程访问,必须确保每个线程所访问的数据的一致性。

注意:线程的资源是有限的。如果太多的线程同时运行,会消耗很多的操作系统资源,从而使得操作系统整体运行得更加缓慢。而且每个线程多需要一个独立的堆栈空间,所以运行太多的线程会耗尽进程的可用内存或地址空间。

通过一个案例来解释多进程和多线程并发:

当两个程序员在两个独立的办公室一起做一个软件项目,他们可以安静地工作、不互相干扰,并且他们人手一套参考手册。但是,他们沟通起来就有些困难,他们必须使用电话、电子邮件或到对方的办公室进行直接交流。并且,管理两个办公室需要有一定的经费支出,还需要购买多份参考手册。

假设,让开发人员同在一间办公室办公,他们可以自由的对某个应用程序设计进行讨论,也可以在纸或白板上轻易的绘制图表,对设计观点进行辅助性阐释。现在,你只需要管理一个办公室,只要有一套参考资料就够了。遗憾的是,开发人员可能难以集中注意力,并且还可能存在资源共享的问题(比如,“参考手册哪去了?”)

以上两种方法,描绘了并发的两种基本途径。每个开发人员代表一个线程,每个办公室代表一个进程。第一种途径是每个进程只要一个线程,这就类似让每个开发人员拥有自己的办公室,而第二种途径是每个进程有多个线程,如同一个办公室里有两个开发人员。


 三、C++11相关多线程编程的头文件

C++11 新标准中引入了五个头文件来支持多线程编程,他们分别是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>

  • <atomic>:该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。
  • <thread>:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文件中。
  • <mutex>:该头文件主要声明了与互斥量(mutex)相关的类,包括 std::mutex 系列类,std::lock_guard, std::unique_lock, 以及其他的类型和函数。
  • <condition_variable>:该头文件主要声明了与条件变量相关的类,包括 std::condition_variable 和 std::condition_variable_any。
  • <future>:该头文件主要声明了 std::promise, std::package_task 两个 Provider 类,以及 std::future 和 std::shared_future 两个 Future 类,另外还有一些与之相关的类型和函数,std::async() 函数就声明在此头文件中。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值