美文网首页
多线程API

多线程API

作者: 二进制人类 | 来源:发表于2022-10-03 21:07 被阅读0次

    获取线程的线程id

    在每一个线程都会有唯一标识的线程ID,在线程环境之下,线程ID是唯一的,如果在整个系统中线程ID不一定唯一。

    #include <pthread.h>
    /**
     * [pthread_self 获取线程的线程id]
     * @return  [线程id]
     */
    pthread_t pthread_self(void);
    

    创建

    #include <pthread.h>
    /**
    参数1:thread指针返回创建成功的线程id;
    参数2:attr结构体指针,在创建线程的时候用于设置线程的属性,可以使用NULL表示是采用默认线程属性。
    参数3:start_routine函数指针,指向的线程指向函数;在线程创建成功按照线程执行函数执行(函数需要由用户设计)
    void * thread_func(void *arg) {
        / 函数体的执行语句需要由用户根据用户需求设计 /                            
    }
    参数4:arg给线程执行函数传递的参数。
    返回值:成功返回0,失败返回线程的错误号,并且线程id没有做定义
     */
    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                                  void *(*start_routine) (void *), void *arg);
    

    注意

    1. 线程创建成功,子线程和主线程的执行顺序式随机的。

    2. 线程创建成功,子线程共享主线程对应进程的资源和数据。

    3. 在线程创建的时候,可以给线程执行函数传递参数。参数根据用户需求进行封装。

    4. 在创建线程的时候,如果创建的多个线程调用的同一个线程执行函数,每一个线程会按照直接的运行。相互之间不会影响。

    实例

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    /* 定义video子线程执行函数 */
    void *video_func(void *arg)
    {
        while(1)
        {
            printf("video pthread : %lu\n", pthread_self());
            sleep(1);
        }
    }
    
    int main()
    {
        int ret;
        pthread_t video_id;
        /* 创建一个子线程:video */
        ret = pthread_create(&video_id, NULL, video_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        /* 主线程 */
        while(1)
        {
            printf("video_id = %lu\n", video_id);
            sleep(1);
        }
    }
    

    线程退出

    #include <pthread.h>
    /**
     * [pthread_exit 退出线程]
     * @param retval [返回线程退出的返回值; (在子线程线程执行函数中使用return 返回值 形式退出)。]
     */
    void pthread_exit(void *retval);
    

    实例

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    /* 定义video子线程执行函数 */
    void *video_func(void *arg)
    {
        while(1)
        {
            printf("video pthread : %lu\n", pthread_self());
            sleep(1);
        }
    }
    
    void *serial_func(void *arg)
    {
        int i = 5;
        while(--i)
        {
            printf("serial pthread : %lu\n", pthread_self());
            sleep(1);
        }
        //pthread_exit("sfdsgdg");
        return "sssssssss";
    }
    
    int main()
    {
        int ret;
        pthread_t video_id;
        pthread_t serial_id;
        /* 创建一个子线程:video */
        ret = pthread_create(&video_id, NULL, video_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        /* 创建一个子线程:video */
        ret = pthread_create(&serial_id, NULL, serial_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        /* 主线程 */
        while(1)
        {
            printf("main pthread\n");
            sleep(5);
            //pthread_exit(NULL);
            //return ;
        }
    }
    

    子线程资源回收

    #include <pthread.h>
    /**
     * [pthread_join 阻塞等待指定子线程退出,并接收子线程退出的返回值]
     * @param  thread [等待的子线程的线程id]
     * @param  retval [二级指针,指向的是线程退出返回值空间的地址。类型需要根据用户需求定义。
            如果设置位NULL,表示不关心子线程退出的状态]
     * @return        [成功返回0,失败返回错误号]
     */
    int pthread_join(pthread_t thread, void **retval);
    

    实例

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    /* 定义video子线程执行函数 */
    void *video_func(void *arg)
    {
        int i = 10;
        int a = 24;
        while(--i)
        {
            printf("video pthread : %lu\n", pthread_self());
            sleep(1);
        }
        pthread_exit(&a);
    }
    
    void *serial_func(void *arg)
    {
        int i = 5;
        while(--i)
        {
            printf("serial pthread : %lu\n", pthread_self());
            sleep(1);
        }
        //pthread_exit("sfdsgdg");
        return "1safsh";
    }
    
    int main()
    {
        int ret;
        pthread_t video_id;
        pthread_t serial_id;
    
        /* 创建一个子线程:video */
        ret = pthread_create(&video_id, NULL, video_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
    
        /* 创建一个子线程:video */
        ret = pthread_create(&serial_id, NULL, serial_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
    
        int *retval;
        /* 主线程 */
        pthread_join(video_id, (void **)&retval);
        printf("%d\n", *retval);
        char *retVal;
        pthread_join(serial_id, (void **)&retVal);
        printf("%s\n", retVal);
    }
    

    取消线程

    #include <pthread.h>
    #include <pthread.h>
    /**
     * [pthread_cancel 在主线程中调用用于取消指定线程id的线程]
     * @param  thread [thread表示需要取消线程的id]
     * @return        [成功返回0,失败返回错误号]
     */
    int pthread_cancel(pthread_t thread);
    

    实例

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdlib.h>
    
    /* 定义video子线程执行函数 */
    void *video_func(void *arg)
    {
        while(1)
        {
            printf("video pthread : %lu\n", pthread_self());
            sleep(1);
        }
    
        pthread_exit(NULL);
    }
    
    void *serial_func(void *arg)
    {
        while(1)
        {
            printf("serial pthread : %lu\n", pthread_self());
            sleep(1);
        }
        return "1safsh";
    }
    
    int main()
    {
        int ret;
        pthread_t video_id;
        pthread_t serial_id;
        /* 创建一个子线程:video */
        ret = pthread_create(&video_id, NULL, video_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        /* 创建一个子线程:video */
        ret = pthread_create(&serial_id, NULL, serial_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        sleep(5);
        /* 主线程中取消serial_id线程 */
        ret = pthread_cancel(serial_id);
        if (ret != 0)
        {
            fprintf(stderr, "create serial pthread fail\n");
            return -1;
        }
        sleep(5);
        /* 主线程中取消vide_id线程 */
        ret = pthread_cancel(video_id);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
    }
    

    分离线程

    #include <pthread.h>
    /**
     * [pthread_detach 分离线程,子线程分离后,子线程退出的时候自己会做资源的回收]
     * @param  thread [分离线程的id]
     * @return        [成功返回0,失败返回错误号]
     PS:分离的子线程,不能在主线程使用pthread_join()
     */
    int pthread_detach(pthread_t thread);
    

    实例

    #include <stdio.h>
    #include <unistd.h>
    #include <pthread.h>
    #include <stdlib.h>
    /* 定义video子线程执行函数 */
    void *video_func(void *arg)
    {
        int i = 10;
        int a = 24;
        while(--i)
        {
            printf("video pthread : %lu\n", pthread_self());
            sleep(1);
        }
    
        pthread_exit(&a);
    }
    
    void *serial_func(void *arg)
    {
        int i = 5;
        while(--i)
        {
            printf("serial pthread : %lu\n", pthread_self());
            sleep(1);
        }
        //pthread_exit("sfdsgdg");
        return "1safsh";
    }
    
    int main()
    {
        int ret;
        pthread_t video_id;
        pthread_t serial_id;
        /* 创建一个子线程:video */
        ret = pthread_create(&video_id, NULL, video_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        /* 分离video_id线程 */
        ret = pthread_detach(video_id);
        if (ret != 0)
        {
            fprintf(stderr, "detach video pthread fail\n");
            return -1;
        }
        /* 创建一个子线程:video */
        ret = pthread_create(&serial_id, NULL, serial_func, NULL);
        if (ret != 0)
        {
            fprintf(stderr, "create video pthread fail\n");
            return -1;
        }
        /* 分离serial_id线程 */
        ret = pthread_detach(serial_id);
        if (ret != 0)
        {
            fprintf(stderr, "detach serial pthread fail\n");
            return -1;
        }
    #if 0
        int *retval;
        /* 主线程 */
        pthread_join(video_id, (void **)&retval);
        printf("%d\n", *retval);
        char *retVal;
        pthread_join(serial_id, (void **)&retVal);
        printf("%s\n", retVal);
    #else
        pthread_exit(NULL);
    #endif
    }
    

    相关文章

      网友评论

          本文标题:多线程API

          本文链接:https://www.haomeiwen.com/subject/akzdartx.html