POSIX 线程库,也称为 Pthreads(POSIX Threads),是一组用于多线程编程的标准 API。它是 POSIX 标准的一部分,广泛应用于 Unix 和 Unix-like 操作系统(如 Linux 和 macOS)。Pthreads 提供了一套线程创建、管理和同步的函数,使程序能够利用多核处理器的并行计算能力。
主要特点
-
线程创建和管理:
- 线程创建:通过
pthread_create
创建新线程。 - 线程终止:线程可以通过返回、调用
pthread_exit
或其他线程调用pthread_cancel
来终止。 - 线程属性:使用
pthread_attr_t
设置线程属性,如栈大小、调度策略等。
- 线程创建:通过
-
线程同步:
- 互斥锁(Mutex):使用
pthread_mutex_t
实现互斥访问,防止多个线程同时访问共享资源。 - 条件变量(Condition Variables):通过
pthread_cond_t
实现线程间的条件同步,允许线程在某些条件满足时被唤醒。 - 读写锁(Read-Write Lock):使用
pthread_rwlock_t
提供更细粒度的控制,允许多个线程读或一个线程写。 - 屏障(Barrier):使用
pthread_barrier_t
使线程在特定点同步。
- 互斥锁(Mutex):使用
-
线程属性:
- 线程分离:使用
pthread_detach
将线程设置为分离状态,线程结束后自动释放资源。 - 线程特定数据(Thread-Specific Data, TSD):通过
pthread_key_t
为每个线程维护特定数据。
- 线程分离:使用
主要函数介绍
-
线程创建与终止:
pthread_create
: 创建新线程。pthread_exit
: 线程终止。pthread_join
: 等待指定线程结束。pthread_detach
: 将线程设置为分离状态。pthread_cancel
: 取消线程。
-
线程同步:
- 互斥锁:
pthread_mutex_init
: 初始化互斥锁。pthread_mutex_lock
: 加锁。pthread_mutex_trylock
: 尝试加锁。pthread_mutex_unlock
: 解锁。pthread_mutex_destroy
: 销毁互斥锁。
- 条件变量:
pthread_cond_init
: 初始化条件变量。pthread_cond_wait
: 等待条件。pthread_cond_signal
: 唤醒一个等待线程。pthread_cond_broadcast
: 唤醒所有等待线程。pthread_cond_destroy
: 销毁条件变量。
- 读写锁:
pthread_rwlock_init
: 初始化读写锁。pthread_rwlock_rdlock
: 加读锁。pthread_rwlock_wrlock
: 加写锁。pthread_rwlock_unlock
: 解锁。pthread_rwlock_destroy
: 销毁读写锁。
- 屏障:
pthread_barrier_init
: 初始化屏障。pthread_barrier_wait
: 在屏障处等待。pthread_barrier_destroy
: 销毁屏障。
- 互斥锁:
-
线程属性和特定数据:
- 线程属性:
pthread_attr_init
: 初始化线程属性对象。pthread_attr_destroy
: 销毁线程属性对象。pthread_attr_setdetachstate
: 设置线程分离状态属性。pthread_attr_getdetachstate
: 获取线程分离状态属性。
- 线程特定数据:
pthread_key_create
: 创建线程特定数据键。pthread_key_delete
: 删除线程特定数据键。pthread_setspecific
: 设置线程特定数据。pthread_getspecific
: 获取线程特定数据。
- 线程属性:
示例代码
下面是一个简单的多线程示例,展示了如何创建和同步线程:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5
void *print_hello(void *threadid) {
long tid;
tid = (long) threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int rc;
long t;
for (t = 0; t < NUM_THREADS; t++) {
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, print_hello, (void *) t);
if (rc) {
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
for (t = 0; t < NUM_THREADS; t++) {
pthread_join(threads[t], NULL);
}
pthread_exit(NULL);
}
在这个示例中,主线程创建了 5 个线程,每个线程打印一条消息,然后终止。主线程等待所有线程结束后再终止。
Pthreads 提供了强大的多线程编程功能,使得开发者可以充分利用多核处理器的并行计算能力,提高程序的执行效率。