linux thread pthread_join

本文详细介绍了线程的基本概念,重点讲解了如何使用pthread_join()函数阻塞等待线程结束,以及如何销毁线程属性结构体。同时强调了线程属性设置的重要性,提倡先初始化再设置的原则。

1    int pthread_join(pthread_t thread, void **retval);

      pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。

      如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。

      retval: 用户定义的指针,用来存储被等待线程的返回值。


      pthread_join( m_thread, NULL );

2    int pthread_attr_destroy(pthread_attr_t *attr);

输入参数

  要删除的线程属性结构体指针

    销毁一个目标结构,并且使它在重新初始化之前不能重新使用。

3   线程属性设置的时候先初始化,再设置。

4   int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

                    void *(*start_routine) ( void *), void *arg);






Linux多线程编程中,`pthread_join()`和`pthread_detach()`是用于管理线程生命周期和资源回收的关键函数。它们分别适用于不同的场景,理解其作用及区别对于编写高效、稳定的多线程程序至关重要。 ### `pthread_join()` 的作用与使用 `pthread_join()` 函数用于阻塞调用线程,直到指定的线程终止,并回收其资源。该函数允许主线程等待某个子线程完成,并获取其退出状态。这在需要确保线程执行完毕后再继续后续操作的场景中非常有用。 ```c int pthread_join(pthread_t thread, void **value_ptr); ``` - `thread` 是要等待的线程标识符。 - `value_ptr` 用于接收线程退出时的返回值,可以为 `NULL` 表示不关心返回值。 使用 `pthread_join()` 后,目标线程的资源会被系统回收,防止资源泄漏。但需要注意的是,一个线程只能被 `pthread_join()` 一次,否则会导致未定义行为[^3]。 ### `pthread_detach()` 的作用与使用 `pthread_detach()` 函数用于将线程设置为分离状态,表示该线程在结束后会自动释放其资源,无需其他线程调用 `pthread_join()` 来回收。这在不需要等待线程结束或线程执行时间较长的场景中非常有用。 ```c int pthread_detach(pthread_t thread); ``` - `thread` 是要分离的线程标识符。 一旦线程被分离,就不能再通过 `pthread_join()` 等待它。分离后的线程在终止时会自动释放所有资源。需要注意的是,如果在调用 `pthread_detach()` 时线程已经终止,其资源可能已经被释放,此时调用仍会成功,但不会产生额外影响[^2]。 ### `pthread_join()` 与 `pthread_detach()` 的区别 | 特性 | `pthread_join()` | `pthread_detach()` | |-----------------------|--------------------------------------------|---------------------------------------------| | **线程状态** | 线程默认为可连接状态(joinable) | 将线程设置为分离状态(detached) | | **资源回收方式** | 必须显式调用 `pthread_join()` 回收资源 | 线程终止后自动释放资源 | | **是否阻塞调用者** | 是,调用者会被阻塞直到目标线程结束 | 否,调用后立即返回,不阻塞调用者 | | **是否可重复调用** | 一个线程只能被 `pthread_join()` 一次 | 可多次调用,但无实际效果 | | **适用场景** | 需要等待线程完成并获取其结果 | 不需要等待线程完成,线程执行完自动释放资源 | ### 常见易错点 - **重复调用 `pthread_join()`**:对同一个线程多次调用 `pthread_join()` 会导致未定义行为。 - **对分离线程调用 `pthread_join()`**:尝试对已分离的线程调用 `pthread_join()` 会导致错误。 - **未正确处理线程状态**:若未正确设置线程为分离状态或未及时调用 `pthread_join()`,可能导致资源泄漏。 - **线程提前终止**:若调用 `pthread_detach()` 前线程已终止,资源可能已经被释放,此时调用不会产生错误,但无实际作用[^1]。 ### 示例代码 以下是一个使用 `pthread_detach()` 的示例: ```c #include <stdio.h> #include <unistd.h> #include <pthread.h> void *thread_func(void *arg) { printf("Thread started\n"); sleep(1); printf("Thread exited\n"); return NULL; } int main() { pthread_t tid; int ret = pthread_create(&tid, NULL, thread_func, NULL); if (ret != 0) { fprintf(stderr, "pthread_create error: %d\n", ret); return -1; } printf("Created new thread with ID %ld\n", tid); ret = pthread_detach(tid); if (ret != 0) { fprintf(stderr, "pthread_detach error: %d\n", ret); return -1; } printf("Thread detached, main thread exited\n"); return 0; } ``` 在该示例中,主线程创建了一个子线程并立即调用 `pthread_detach()`,使子线程在结束后自动释放资源,主线程不会阻塞等待子线程结束[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值