#include <pthread.h>

#include <pthread.h>
寻觅~流光#include <pthread.h>
<pthread.h>
是 POSIX 线程(Pthreads) 的标准头文件,用于 多线程编程。它提供了创建、同步和管理线程的函数,是 Linux/Unix 系统下多线程开发的核心库。
1. 核心功能
功能 | 关键函数 | 用途 |
---|---|---|
线程创建 | pthread_create() | 创建新线程 |
线程终止 | pthread_exit() , pthread_cancel() | 终止当前线程或指定线程 |
线程同步 | pthread_mutex_* , pthread_cond_* | 互斥锁、条件变量 |
线程连接 | pthread_join() | 等待线程结束并获取返回值 |
线程属性 | pthread_attr_* | 设置线程属性(如栈大小、分离状态) |
2. 详细函数解析
2.1 线程创建与管理
(1) pthread_create()
- 创建线程
1 | int pthread_create(pthread_t *thread, const pthread_attr_t *attr, |
参数:
thread
:存储新线程 ID。attr
:线程属性(NULL
表示默认)。start_routine
:线程入口函数(返回void*
,参数void*
)。arg
:传递给start_routine
的参数。
返回值:
- 成功:
0
。 - 失败:错误码(非
errno
)。
- 成功:
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void* print_hello(void *arg) {
printf("Hello from thread! Arg: %d\n", *(int*)arg);
return NULL;
}
int main() {
pthread_t tid;
int arg = 42;
pthread_create(&tid, NULL, print_hello, &arg);
pthread_join(tid, NULL); // 等待线程结束
return 0;
}
(2) pthread_exit()
- 线程退出
1 | void pthread_exit(void *retval); |
- 功能:终止当前线程,
retval
可被pthread_join()
捕获。 - 注意:
main()
中调用会导致进程退出(除非其他线程在运行)。
(3) pthread_cancel()
- 取消线程
1 | int pthread_cancel(pthread_t thread); |
- 问题:目标线程需在可取消点(如
sleep()
)才能终止。
2.2 线程同步
(1) 互斥锁(Mutex)
1 | pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 静态初始化 |
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17pthread_mutex_t mutex;
void* thread_func(void *arg) {
pthread_mutex_lock(&mutex);
printf("Critical section\n");
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_mutex_init(&mutex, NULL);
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
(2) 条件变量(Condition Variable)
1 | pthread_cond_t cond = PTHREAD_COND_INITIALIZER; |
典型用途:生产者-消费者模型。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21pthread_mutex_t mutex;
pthread_cond_t cond;
int data_ready = 0;
void* consumer(void *arg) {
pthread_mutex_lock(&mutex);
while (!data_ready) {
pthread_cond_wait(&cond, &mutex); // 自动释放锁并等待
}
printf("Consumed data\n");
pthread_mutex_unlock(&mutex);
return NULL;
}
void* producer(void *arg) {
pthread_mutex_lock(&mutex);
data_ready = 1;
pthread_cond_signal(&cond); // 通知消费者
pthread_mutex_unlock(&mutex);
return NULL;
}
2.3 线程连接与分离
(1) pthread_join()
- 等待线程结束
1 | int pthread_join(pthread_t thread, void **retval); |
- 功能:阻塞当前线程,直到
thread
终止,retval
接收返回值。 - 注意:线程必须是非分离的(
joinable
)。
(2) pthread_detach()
- 分离线程
1 | int pthread_detach(pthread_t thread); |
- 功能:线程终止后自动释放资源,不可再
pthread_join()
。
3. 线程属性
设置线程栈大小
1 | pthread_attr_t attr; |
分离状态
1 | pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); |
4. 完整示例
多线程计算数组和
1 |
|
5. 注意事项
- 错误处理:
- Pthreads 函数返回错误码(非
errno
),需用strerror()
打印。
- Pthreads 函数返回错误码(非
- 资源泄漏:
- 忘记
pthread_join()
或pthread_detach()
会导致僵尸线程。
- 忘记
- 死锁风险:
- 确保互斥锁在所有分支(如
return
前)解锁。
- 确保互斥锁在所有分支(如
- 性能考量:
- 线程创建开销大,考虑使用线程池。
6. 总结
<pthread.h>
的核心用途:
- 线程生命周期管理:
pthread_create()
,pthread_exit()
,pthread_join()
。
- 同步机制:
- 互斥锁(
pthread_mutex_*
)、条件变量(pthread_cond_*
)。
- 互斥锁(
- 高级控制:
- 线程属性(栈大小、分离状态)。
适用于 高并发服务器、并行计算、实时系统。
评论
匿名评论隐私政策
TwikooWaline
✅ 你无需删除空行,直接评论以获取最佳展示效果