C++多线程入门[整理]
在现代计算机系统中,多线程编程是提高系统性能和响应速度的重要手段。C++作为一门面向对象的编程语言,提供了对多线程编程的支持。本文将从基本概念开始,介绍多线程编程的基本概念、线程的创建、线程状态、线程运行环境、线程类定义等内容,并提供了相关的示例代码。
一、多线程编程的基本概念
在早期的计算机系统中,计算能力是一种宝贵资源。为了更好地理解多线程的概念,先对进程、线程的概念背景做一下简单介绍。进程是包含程序指令和相关资源的集合。每个进程和其他进程一起参与调度,竞争 CPU、内存等系统资源。每次进程切换,都存在进程资源的保存和恢复动作,这称为上下文切换。
多进程系统可以解决支持多用户的问题,但是也引发了新的问题:进程频繁切换引起的额外开销可能会严重影响系统性能;进程间通信要求复杂的系统级实现。在程序功能日趋复杂的情况下,上述缺陷也就凸现出来。例如,一个简单的 GUI 程序,为了有更好的交互性,通常用一个任务支持界面交互,另一个任务支持后台运算。如果每个任务均由一个进程来实现,那会相当低效。
对每个进程来说,系统资源看上去都是其独占的。比如,内存空间,每个进程认为自己的内存空间是独有的。一次切换,这些独立资源都需要切换。由此就演化出了利用分配给同一个进程的资源,尽量实现多个任务的方法。这也就引入了线程的概念。
二、线程状态
线程状态在一个线程的生存期内,可以在多种状态之间转换。不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态。但大体说来,如下几种状态是通用的:
* 就绪:参与调度,等待被执行。一旦被调度选中,立即开始执行。
* 运行:占用 CPU,正在运行中。
* 休眠:暂不参与调度,等待特定事件发生。
* 中止:已经运行完毕,等待回收线程资源(要注意,这个很容易误解,后面解释)。
三、线程运行环境
线程存在于进程之中。进程内所有全局资源对于内部每个线程均是可见的。进程内典型全局资源有:
* 代码区。这意味着当前进程空间内所有可见的函数代码,对于每个线程来说也是可见的。
* 静态存储区。全局变量。静态变量。
* 动态存储区。也就是堆空间。
线程内典型的局部资源有:
* 本地栈空间。存放本线程的函数调用栈,函数内部的局部变量等。
* 部分寄存器变量。例如本线程下一步要执行代码的指针偏移量。
四、线程类定义
在 C++ 中,对多线程的支持由具体操作系统提供的函数接口支持。不同的系统中具体实现方法不同。后面所有例子只给出 Windows 和 Unix/Linux 的实现。在后面的实现中,考虑的是尽量封装隔离底层的多线程函数接口,屏蔽操作系统底层的线程实现具体细节,介绍的重点是多线程编程中较通用的概念。同时也尽量体现 C++ 面向对象的一面。
五、示例程序
在后面的实现中,我们将提供一些示例程序,以便更好地理解多线程编程的基本概念和技术。
六、线程的创建
线程的创建是多线程编程的基本步骤。在不同的操作系统中,线程的创建方法也不同。在 Windows 中,可以使用 CreateThread 函数创建线程,而在 Unix/Linux 中,可以使用 pthread_create 函数创建线程。
七、总结
多线程编程是现代计算机系统中提高性能和响应速度的重要手段。C++ 作为一门面向对象的编程语言,提供了对多线程编程的支持。通过了解多线程编程的基本概念、线程状态、线程运行环境、线程类定义等内容,我们可以更好地理解和应用多线程编程技术。