在 POSIX 线程(pthread)中,pthread_create
函数创建的新线程默认是处于 可加入(joinable) 状态,而不是分离(detached)状态。这意味着新创建的线程在终止后,其资源不会立即释放,除非调用 pthread_join
函数来回收这些资源。
pthread_create
函数原型
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
thread
:指向线程标识符的指针。attr
:指向线程属性结构的指针,可以为NULL
表示使用默认属性。start_routine
:线程启动时执行的函数。arg
:传递给启动函数的参数。
默认属性
默认情况下,attr
参数为 NULL
,表示使用默认的线程属性。默认属性中,线程是可加入的(joinable)。
设置线程为分离状态
如果你想将线程设置为分离状态,可以在创建线程之前修改线程属性结构 pthread_attr_t
,然后将其传递给 pthread_create
函数。
示例代码
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* thread_function(void* arg) {
printf("Thread is running\n");
// 线程执行的代码
return NULL;
}
int main() {
pthread_t thread;
pthread_attr_t attr;
// 初始化线程属性
pthread_attr_init(&attr);
// 设置线程为分离状态
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// 创建线程
if (pthread_create(&thread, &attr, thread_function, NULL) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
// 销毁线程属性
pthread_attr_destroy(&attr);
// 主线程继续执行
printf("Main thread is running\n");
// 主线程等待一段时间,确保子线程有足够的时间运行
sleep(1);
return 0;
}
关键点
- 默认状态:
pthread_create
创建的线程默认是可加入的(joinable)。 - 设置分离状态:可以通过
pthread_attr_setdetachstate
函数将线程属性设置为分离状态。 - 回收资源:对于可加入的线程,必须调用
pthread_join
来回收资源;对于分离的线程,资源会在线程终止时自动释放。
pthread_join
示例
如果你创建了一个可加入的线程,并且希望在主线程中等待该线程结束并回收资源,可以使用 pthread_join
函数。
示例代码
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void* thread_function(void* arg) {
printf("Thread is running\n");
// 线程执行的代码
return NULL;
}
int main() {
pthread_t thread;
// 创建线程
if (pthread_create(&thread, NULL, thread_function, NULL) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
// 主线程继续执行
printf("Main thread is running\n");
// 等待线程结束并回收资源
if (pthread_join(thread, NULL) != 0) {
perror("pthread_join");
exit(EXIT_FAILURE);
}
printf("Thread has finished\n");
return 0;
}
总结
- 默认状态:
pthread_create
创建的线程默认是可加入的(joinable)。 - 设置分离状态:可以通过
pthread_attr_setdetachstate
将线程设置为分离状态。 - 回收资源:对于可加入的线程,必须调用
pthread_join
来回收资源;对于分离的线程,资源会在线程终止时自动释放。