C语言多线程编程全解析
1. 多线程概述
C程序常常需要同时执行多个任务,例如:
- 并行执行中间任务的程序,可提升性能。
- 在进行耗时的数据通信或实时操作时,还能处理用户输入。
不同任务通过程序部分的并发执行来同时完成。在现代多处理器系统中,利用并发来高效使用系统资源变得愈发重要。
过去,C开发者需依赖操作系统特性或合适的库来实现并发执行。而新的C11标准让C编程中的并发具有可移植性。C11支持多线程执行,即一个进程内有多个并行的控制流路径,提供了与现代操作系统相同程度的并发能力。为此,C11定义了合适的内存模型并支持原子操作。不过,C11标准中对多线程和原子操作的支持是可选的。若实现不提供相应功能,需定义 __STDC_NO_THREADS__
和 __STDC_NO_ATOMICS__
宏。
2. 线程基础
当启动一个程序时,操作系统会创建一个新进程来执行该程序。一个进程由一个或多个线程组成,每个线程是一个部分进程,能独立于进程的其他部分执行一系列指令。进程开始时,其主线程处于活动状态,之后任何运行中的线程都可启动其他线程。当进程终止(如在 main()
函数中执行 return
语句或调用 exit()
函数)时,所有已启动但未结束的线程都会被终止。
系统调度器会将可用的CPU时间平均分配给所有可运行的线程。通常调度器是抢占式的,它会每隔一小段时间中断CPU正在执行的线程,并让CPU在一段时间内执行另一个线程。因此,即使在单处理器系统中,线