多线程API

2022-10-03  本文已影响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
}
上一篇下一篇

猜你喜欢

热点阅读