在 Linux 下进行线程开发,主要使用 POSIX 提供的 pthread
库。pthread
API 涵盖了线程的整个生命周期管理以及线程间同步与通信等功能。整体上,这些 API 可分为三大类:线程管理类函数、同步机制类函数 和 线程控制类函数。
其中,线程管理类函数包括 pthread_create
(创建线程)、pthread_join
(等待线程结束)、pthread_exit
(线程退出)、pthread_detach
(分离线程)等,主要负责线程的创建、运行与回收;同步机制类函数如 pthread_mutex_*
(互斥锁)、pthread_cond_*
(条件变量)等用于协调多个线程对共享资源的安全访问;而线程控制类函数如 pthread_cancel
(线程取消)、pthread_self
(获取线程 ID)、pthread_setcancelstate
(设置可取消状态)等,则提供了对线程行为的细粒度控制。
1. 线程创建与管理API
线程创建与终止
API | 功能描述 | 关键特性 |
---|---|---|
pthread_create() | 创建新线程 | 指定入口函数和参数,返回线程ID |
pthread_exit() | 终止当前线程 | 可携带返回值,不影响其他线程 |
pthread_cancel() | 请求取消指定线程 | 异步终止目标线程 |
线程状态控制
API | 功能描述 | 关键特性 |
---|---|---|
pthread_join() | 等待线程终止 | 阻塞调用者,可获取线程返回值 |
pthread_detach() | 分离线程 | 线程终止后自动回收资源 |
线程标识
API | 功能描述 | 关键特性 |
---|---|---|
pthread_self() | 获取当前线程ID | 类似进程的getpid() |
pthread_equal() | 比较两个线程ID | 用于判断线程ID是否相同 |
1.1 pthread_create - 创建线程
函数原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
参数解析:
-
thread
:指向线程标识符的指针,用于存储新线程的ID -
attr
:线程属性指针,NULL表示使用默认属性 -
start_routine
:线程函数的入口地址,该函数接收void参数并返回void -
arg
:传递给线程函数的参数
返回值:
-
成功返回0
-
失败返回错误码(非errno)
详细说明:
-
新线程创建后会立即执行
start_routine
函数 -
主线程和子线程的执行顺序不确定
-
线程函数可以通过返回值传递退出状态(使用pthread_join获取)
示例代码:
void *thread_func(void *arg) {
printf("Thread created with arg: %d\n", *(int*)arg);
return NULL;
}
int main() {
pthread_t tid;
int arg = 42;
int ret = pthread_create(&tid, NULL, thread_func, &arg);
if (ret != 0) {
fprintf(stderr, "Error creating thread: %s\n", strerror(ret));
}
pthread_join(tid, NULL);
return 0;
}
1.2 pthread_join - 等待线程终止
函数原型:
int pthread_join(pthread_t thread, void **retval);
参数解析:
-
thread
:要等待的线程ID -
retval
:指向指针的指针,用于存储线程的返回值
返回值:
-
成功返回0
-
失败返回错误码
详细说明:
-
调用线程将被阻塞,直到指定线程终止
-
如果
retval
不为NULL,将存储目标线程的返回值 -
每个线程只能被一个线程join一次
-
不join会导致线程资源泄漏(类似进程的僵尸进程)
示例代码:
void *thread_func(void *arg) {
int *result = malloc(sizeof(int));
*result = 42;
pthread_exit(result);
}
int main() {
pthread_t tid;
void *retval;
pthread_create(&tid, NULL, thread_func, NULL);
pthread_join(tid, &retval);
printf("Thread returned: %d\n", *(int*)retval);
free(retval);
return 0;
}
1.3 pthread_detach - 分离线程
函数原型:
int pthread_detach(pthread_t thread);
参数解析:
-
thread
:要分离的线程ID
返回值:
-
成功返回0
-
失败返回错误码
详细说明:
-
被分离的线程终止时会自动释放资源
-
分离后的线程不能再被pthread_join
-
通常用于不需要获取返回值的后台线程
示例代码:
void *thread_func(void *arg) {
// 后台任务代码
return NULL;
}
int main() {
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
pthread_detach(tid);
// 主线程可以继续执行其他任务
return 0;
}
1.4 pthread_exit - 线程退出
函数原型:
void pthread_exit(void *retval);
说明:
-
显式终止调用线程
-
retval
可作为线程返回值被pthread_join获取 -
主线程调用pthread_exit不会终止进程,直到所有线程结束
1.5 pthread_self - 获取线程ID
函数原型:
pthread_t pthread_self(void);
1.6 pthread_equal - 比较线程ID
函数原型:
int pthread_equal(pthread_t t1, pthread_t t2);
参数
t1
,t2
:要比较的两个线程标识符(pthread_t
类型)。
返回值
- 非零值:如果
t1
和t2
指向同一个线程。 - 0:如果
t1
和t2
指向不同的线程。