pthread_create()函数能够在进程中创建一个线程,创建出来的新线程是主线程的子线程;需要注意的是,新线程与主线程之间的关系并非父子关系,而是并行执行的多个线程。
1.头文件
#include <pthread.h>
2.函数原型
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
3.参数
thread:指向pthread_t类型的指针,用于存储新创建线程的ID。
attr:用于指定新线程的属性,传入NULL表示使用默认属性。
start_routine:新线程的入口函数指针,指向线程创建后将要执行的函数。
arg:传递给start_routine的参数。
4.返回值
成功:返回 0。失败:返回错误码,表示不同的错误原因。
5.注意事项
1)确保线程函数为全局或静态:线程函数 start_routine 必须是一个具有静态生命周期的函数(例如全局函数或静态函数),这样可以避免在创建线程前函数被释放的风险。
2)确保传递给 arg 参数的数据有效:arg 通常用于传递数据指针。确保传递的数据在整个线程生命周期内有效,避免使用栈上的局部变量,防止访问无效地址。如果需要传递多个参数,可以通过结构体将多个参数打包,传递结构体指针给线程函数。
3)检查 pthread_create() 的返回值:pthread_create() 返回值为 0 表示线程创建成功,非 0 值表示发生错误。可以使用 errno 查看具体的错误类型。失败的常见原因包括资源不足(例如线程过多)和无效参数(如线程属性无效)。
4)线程属性设置:如果需要设置线程为分离状态,可以使用 pthread_attr_t 结构初始化线程属性,然后设置 PTHREAD_CREATE_DETACHED。分离状态(后面再介绍)的线程在结束后自动释放资源,不需要 pthread_join()。
实现一个分离线程的流程如下。
pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&thread, &attr, start_routine, arg); pthread_attr_destroy(&attr) |
5)避免在线程中直接使用 exit():如果线程函数直接调用 exit(),会导致整个进程退出。要结束线程,可以使用 pthread_exit() 或让线程函数正常返回。
6)管理线程的返回值:如果线程是非分离状态,需要 pthread_join() 等待其结束,以获取返回值并回收资源。若线程是分离状态,不需要 pthread_join(),会自动释放资源,但无法获取返回值。