pthead 创建与销毁详解 pthread_create pthread_join pthread_exit pthread_detach

pthead 创建与销毁

pthread_create

  • 函数原型:

    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                       void *(*start_routine)(void *), void *arg);
    
    • thread:指向 pthread_t 类型的指针,用于存储新线程的标识符。
    • attr:指向 pthread_attr_t 类型的指针,用于设置新线程的属性,为 NULL 则使用默认属性。
    • start_routine:指向函数的指针,新线程的运行入口。
    • arg:传递给 start_routine 的参数,可以为 NULL。
    • 返回值:成功返回 0,失败返回错误代码。
  • 创建一个新的线程,并以 start_routine 指定的函数作为入口而开始执行。

  • 新线程可以通过以下方式停止:

    • 自身调用 pthread_exit,其结束状态码可以在主进程中通过 pthread_join 获得;
    • start_routine 返回,返回值等同于 pthread_exit 的结束状态码;
    • 在主线程中调用 pthread_cancel
    • 主进程中的任何线程调用 exit 函数或者主进程从 main 返回。
  • 新线程的 cpu time clock0

  • 新线程将继承其父进程的 cpu 亲和性。

pthread_exit

  • 函数原型:

    void pthread_exit(void *retval);
    
    • retval:线程的退出状态,可以是任意类型的指针,可以为 NULL。
  • 立即终止当前线程的执行,并将 retval 作为线程的退出状态返回给调用者。线程的退出状态可以通过其他线程使用 pthread_join 函数来获取。

pthread_join

  • 函数原型:

    int pthread_join(pthread_t thread, void **retval);
    
    • thread:要等待的线程标识符,其必须为 join-able。
    • retval:指向指针的指针,用于存储被等待线程的返回值,可以为 NULL。
    • 返回值:成功返回 0,失败返回错误代码。
  • 阻塞调用它的线程,等待指定线程的结束,并获取其返回值。如果指定的线程早已结束,则立即返回。

  • 以下代码演示了 pthread_create,pthread_join,pthread_exit 的使用:

    #include 
    #include 
    #include 
    
    #define NEED_EXIT_STATUS (0)
    
    void *thread_func(void *arg)
    {
        printf("thread started\n");
        int *value = (int *)arg;
        // 输出为 10
        printf("received value: %d\n", *value);
        // 修改传入的值
        *value = 100;
        sleep(1);
    
    #if NEED_EXIT_STATUS
        // 需要返回结束状态码, 以下两种方法都可以,推荐使用 return
        // pthread_exit((void *)value);
        return value;
    #else
        // 不需要返回结束状态码,以下两种方法都可以,推荐使用 return
        // pthread_exit(NULL);
        return NULL;
    #endif
    }
    
    int main()
    {
        pthread_t tid;
        int value = 10;
        // 创建一个新线程,并以 thread_func 作为入口函数,传递给 thread_func 函数的参数为 value
        int ret = pthread_create(&tid, NULL, thread_func, (void *)&value);
        if (ret != 0) {
            fprintf(stderr, "pthread_create error: %d\n", ret);
            return -1;
        }
        printf("created new thread with id %ld\n", tid);
    
    #if NEED_EXIT_STATUS
        // 等待线程结束并获取退出状态
        void *thread_retval;
        ret = pthread_join(tid, &thread_retval);
        if (ret != 0) {
            fprintf(stderr, "pthread_join error: %d\n", ret);
            return -1;
        }
    
        int *retval = (int *)thread_retval;
        printf("thread exited with value: %d\n", *retval);
    #else
        // 等待线程结束不获取退出状态
        ret = pthread_join(tid, NULL);
        if (ret != 0) {
            fprintf(stderr, "pthread_join error: %d\n", ret);
            return -1;
        }
        printf("thread %ld exit normal\n", tid);
    #endif
    
        return 0;
    }
    

pthread_detach

  • 函数原型:

    int pthread_detach(pthread_t thread);
    
    • thread:要设置为分离状态的线程标识符。
    • 返回值:成功返回 0,失败返回错误代码。
  • 将指定线程设置为“分离状态”,使得该线程结束时能够自动释放其资源。

  • 一旦线程被设置为分离状态,就不能再调用 pthread_join 等待它的结束。

  • 以下代码演示了 pthread_detach 的使用:

    #include 
    #include 
    #include 
    
    #define NEED_EXIT_STATUS (0)
    
    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;
    }
    

你可能感兴趣的:(并发编程,linux,c语言)