• 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard-线程的创建与终止之创建线程

06/22 10:34
170
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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(),会自动释放资源,但无法获取返回值。

相关推荐