### 第14章 多线程编程
#### 14.1 线程的基本概念
**线程**是进程中的最小执行单元,它运行在进程的空间之内,并且多个线程能够共享进程的所有资源,除了那些运行过程中必不可少的资源如程序计数器、寄存器和栈等。
##### 14.1.1 多线程的意义
- **提高应用程序的响应速度**: 在用户界面线程处理交互的同时,其他线程可以处理计算密集型的任务,从而使得整个应用更为流畅。
- **提高多CPU系统的效率**: 利用多线程可以充分利用多核处理器的能力,提高并行处理能力,从而提升整体性能。
##### 14.1.2 线程与进程的比较
- **开销小,切换快**: 相比于进程,线程之间的切换消耗的资源更少,切换速度更快。
- **高效的通信机制**: 由于线程共享相同的内存空间,因此它们之间的数据交换更为直接和快速。
##### 14.1.3 多线程编程标准与线程库
目前主流的多线程编程标准包括:
- **WIN32**: 专用于Windows操作系统。
- **OS/2**: 专用于OS/2操作系统。
- **POSIX (Portable Operating System Interface of UNIX)**: 是一种跨平台的标准,最初是为了提高Unix环境下应用程序的可移植性而提出的,但现在已经扩展到多种操作系统平台,包括Linux。
##### 14.1.4 Linux的线程机制
在Linux内核层面,并没有线程这一概念。所有线程都被视为进程处理,每个线程拥有唯一的`task_struct`,并且它们之间共享某些资源(如地址空间)。这种模型被称为“多对一”模型,即多个用户级线程映射到一个内核级线程。
#### 14.2 线程的基本操作
本节介绍了线程的基本操作,包括创建、合并、终止以及属性设置。
##### 14.2.1 线程的创建
线程创建使用`pthread_create`函数,其原型如下:
```c
extern int pthread_create(pthread_t *__restrict __newthread, const pthread_attr_t *__restrict __attr, void *(*__start_routine)(void *), void *__restrict __arg);
```
参数解释:
- `__newthread`: 新创建的线程ID。
- `__attr`: 线程属性。
- `__start_routine`: 线程启动时执行的函数指针。
- `__arg`: 传递给`__start_routine`函数的参数。
##### 14.2.2 线程的合并
线程合并通常通过`pthread_join`函数完成,该函数阻塞当前线程直至目标线程结束。
```c
int pthread_join(pthread_t __th, void **__thread_return);
```
参数解释:
- `__th`: 要等待的线程ID。
- `__thread_return`: 存储被等待线程的返回值。
##### 14.2.3 线程的终止
线程可以通过以下两种方式终止:
- **线程自身调用`pthread_exit`函数**:
```c
void pthread_exit(void *retval);
```
- **其他线程调用`pthread_cancel`函数**:
```c
int pthread_cancel(pthread_t thread);
```
##### 14.2.4 线程的属性
线程属性可通过`pthread_attr_t`数据结构管理,主要包括:
- **分离状态**:
- `int pthread_attr_setdetachstate(pthread_attr_t *__attr, int __detachstate)`
- 设置线程是否为分离状态。分离状态下的线程在其结束后不会被其他线程等待。
- **优先级**:
- 使用`pthread_attr_getschedparam`和`pthread_attr_setschedparam`函数获取和设置线程优先级。
#### 14.3 线程的同步
为了确保多个线程之间的正确协作,需要使用同步机制。
##### 14.3.1 互斥量
互斥量(Mutex)是一种常用的同步机制,它用于保护临界区,防止多个线程同时访问同一资源。
初始化互斥量使用`pthread_mutex_init`函数:
```c
int pthread_mutex_init(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr);
```
- `__mutex`: 互斥量对象。
- `__mutexattr`: 互斥量属性,通常为NULL表示使用默认属性。
以上总结了《第14章 多线程编程》中的关键知识点,包括线程的基本概念、操作方法以及同步机制。这些内容对于理解和掌握多线程编程至关重要。