Linux线程——线程创建与管理常用API总结

在 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);

参数

  • t1t2:要比较的两个线程标识符(pthread_t 类型)。

返回值

  • 非零值:如果 t1 和 t2 指向同一个线程。
  • 0:如果 t1 和 t2 指向不同的线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hardStudy_h

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值