【C++11多线程入门教程】系列之线程与进程的基本概念

为什么需要C++多线程

  C++多线程是能够提高程序效率的一种编写策略。学习多线程可以有效的充分利用程序的操作机制来一起同时并行的做些工作。我们都知道众人拾柴火焰高,说的就是这个道理。

并发与并行的基本概念

并发:简单理解为两个或更多独立的活动同时发生。

  举例:生活中,你可以一边走路一边说话,也可以通过两只手做不同的动作。这里的走路、说话、手动作都可以独立且同时发生,这就可以视为并发。

计算机系统的并发:单个系统同时执行多个独立的任务,而非顺序的进行一些活动。

  伪并发:单核上进行的任务切换,虽然任务之间切换很快,还是会存在一定程度的暂时挂起,这是一种并发假象。
在这里插入图片描述

双核机器的并发运行与单核任务切换

并发的途径:多进程并发与多线程并发

多进程并发:

在这里插入图片描述

  计算机能够将应用程序分为多个独立的进程,让它们同一时刻运行。例如:网页浏览与文字处理。上图中进程1与2为独立运行,它们之间可以通过常规通信渠道来进行消息传递(信息、文件、管道等)。操作系统要对进程间通信有一定保护措施,以此来避免一个进程去修改另一个进程的数据。优点:进程间通信更加安全,同时编写安全的并发代码更加容易。缺点:进程间通信设置复杂、速度较慢。同时运行多个进程所需要的开销较大:启动进程、操作系统需要内部资源来管理进程等。

多线程并发

在这里插入图片描述

  单个进程中运行多个线程,这是另外一种并发的方式。如上图所示,进程中的所有线程都共享地址空间,并且所有线程访问大部分的数据:全局变量仍然为全局的,指针、对象的引用或数据都可以在线程之间进行传递。优点:多线程使得操作系统管理资源记录工作量减少,同时多线程的开销远远低于多进程的开销。缺点:由于地址空间共享,以及缺少线程间数据的保护,那么写程序的人必须确保每个线程所访问的数据是一致的。

线程与进程概念

进程与线程讲解

#include <iostream>

int main(void)
{
	std::cout << "I learn C++!" << std::endl;
	return 0;
}
  1. 上面的代码在Visual Studio编译后,或生成对应的exe(Linux下用GCC编译成可执行文件),运行这个exe后就是一个进程被启动,同时我们在终端看到I learn C++!
  2. 一个进程必有且只能有一个主线程。主线程与进程共同生成与消失。
  3. 除了主线程外,其它子线程需要手动创建。
  4. 一个进程可以包含多个线程,反之不成立。
  5. 子线程的生命周期与进程无关。
C++线程基本使用示例

C++多线程使用基本示例:

#include <iostream>
#include <thread>

void create_thread()
{
	std::cout << "create_thread() start." << std::endl;
	// ...
	std::cout << "create_thread() end." << std::endl;
}

int main(void)
{
	std::cout << "The main thread start." << std::endl;

	std::thread usedThread(create_thread);
	usedThread.join();

	std::cout << "The main thread end." << std::endl;
	return 0;
}
  • 通过引用多线程头文件#include<thread>使用。
  • 通过使用std::thread来声明一个子线程,并非主线程。
  • 通过使用.join()函数来让主线程等待子线程运行结束。
  • 当子线程运行结束,主线程继续执行。

终端输出:

The main thread start.
create_thread() start.
create_thread() end.
The main thread end.
小结

  本篇简单介绍一下C++中多线程与多进程的区别,总结如下:

  • 一个进程有且仅有一个主线程,且二者生命周期一致。
  • 一个进程可以包含多个线程,反之不成立。
  • 子线程的生命周期与进程无关,需要程序员管理子线程生命周期。
  • 多线程的时间开销远远低于多进程,但是对于多线程的管理较多进程复杂些。
  • 主线程不需要创建,子线程需要程序员手动创建且进行生命周期管理。
参考

https://en.cppreference.com/w/cpp/thread/thread

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值