当前位置: 首页 > article >正文

Linux下的线程操作

一、多线程的创建于退出

1. pthread_create(线程的创建)

pthread_create 是 POSIX 线程库中的函数,用于创建一个新的线程。
函数原型如下:

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:传递给线程函数的参数,可以是任意类型的指针。

pthread_create 函数会创建一个新的线程,并在新线程中执行指定的线程函数 start_routine。线程函数的参数可以通过 arg 传递。

2.ptherad_join(等待指定线程的终止)

pthread_join 是 POSIX 线程库中的函数,用于等待指定的线程终止,并获取线程的退出状态。
函数原型如下:

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

参数说明:

  • thread:要等待的线程的标识符。
  • retval:指向指针的指针,用于存储线程的退出状态。如果不需要获取退出状态,可以传递 NULL。

pthread_join 函数会阻塞当前线程,直到指定的线程终止。一旦线程终止,pthread_join 函数会返回,并将线程的退出状态存储在 retval 指向的位置。如果不需要获取退出状态,可以将 retval 设置为 NULL。

3.pthread_exit(线程的退出)

pthread_exit 是 POSIX 线程库中的函数,用于终止当前线程并返回一个退出状态。
函数原型如下:

void pthread_exit(void *retval);

参数说明:

  • retval:线程的退出状态,可以是任意类型的指针。

pthread_exit 函数会立即终止当前线程,并将 retval 参数作为线程的退出状态。线程的退出状态可以是任意类型的指针,因为 pthread_exit 函数的参数类型是 void*。

4.pthread_cancel(线程的取消)

pthread_cancel 是 POSIX 线程库中的函数,用于取消指定的线程。
函数原型如下:

int pthread_cancel(pthread_t thread);

参数说明:

  • thread:要取消的线程的标识符。

5.pthread_setcancelstate(设置线程的取消状态)

pthread_setcancelstate 是 POSIX 线程库中的函数,用于设置线程的取消状态。
函数原型如下:

int pthread_setcancelstate(int state, int *oldstate);

参数说明:

  • state:要设置的取消状态,可以是以下两个值之一:
    • PTHREAD_CANCEL_ENABLE:启用线程的取消功能。
    • PTHREAD_CANCEL_DISABLE:禁用线程的取消功能。
  • oldstate:用于存储之前的取消状态的指针

pthread_setcancelstate 函数用于设置线程的取消状态。取消状态决定了线程是否可以被取消。如果取消状态被设置为 PTHREAD_CANCEL_ENABLE,则线程可以被取消;如果取消状态被设置为 PTHREAD_CANCEL_DISABLE,则线程不会被取消。
当线程被取消时,会根据取消类型的设置来决定线程的行为。取消类型可以通过 pthread_setcanceltype 函数设置。

6.例子

#include <stdio.h>                                                                                                                                  
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

pthread_t tid[2];

//void *类型的函数可以没有显示的返回值
void *my_thread1(void *arg)
{
    for(int i = 0; i < 3; i++)
    {   
        printf("this is my_thread1\n");
        sleep(1);
    }
    
    //取消线程2
    pthread_cancel(tid[1]);
    //线程退出
//  pthread_exit((void *)100);
    return (void *)100;
}

void *my_thread2(void *arg)
{
    //修改属性,不能被取消
    int old;
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &old);
    for(int i = 0; i < 5; i++)
    {   
        printf("%s\n", (char *)arg);
        sleep(1);
    }   
}

int main()
{ 
    //1.线程号 2.线程属性 3.线程函数 3.线程函数参数
    if(pthread_create(&tid[0], NULL, my_thread1, NULL) != 0)
    {
        perror("pthread_create");
        exit(1);
    }

    //虽然 "helloworld" 是一个字符串常量,但它在 C 语言中被视为字符数组的首地址,
    //因此可以将其传递给 pthread_create 函数作为参数。
    if(pthread_create(&tid[1], NULL, my_thread2, "helloworld") != 0)
    {
        perror("ptherad_create");
        exit(2);
    }
    
    //主线程一定不能提前结束
    //主线程等待,直到两个线程都结束
    void *status;
    pthread_join(tid[0], &status); //等待子线程结束,回收线程资源
    printf("线程1结束: %d\n", (int)status);
    pthread_join(tid[1], &status);
    printf("线程2结束\n");
    
    return 0;
}                   

http://www.kler.cn/a/227496.html

相关文章:

  • Java 集合List相关面试题
  • java hutool工具类实现将数据下载到excel
  • 蓝桥杯备战——13.PCF8591芯片的使用
  • Windows11通过Hyper-V创建VM,然后通过vscode连接vm进行开发
  • QT Creator 的代码重构工具
  • 基于Langchain-Chatchat + chatglm3部署一套属于自己的本地知识库
  • linux远程执行命令后中断联系使远程机独立运行
  • h.264与h.263的区别
  • 字符串比较中==和equals的区别(Java)
  • Java 数据结构 二叉树(二)红黑树
  • 开源浏览器Firefox:使用Docker本地部署并远程访问进行测试
  • Linux的7个运行级别
  • SQL Server 函数参考手册(SQL Server 字符串函数)
  • 《Vue3 基础知识》 使用 GoGoCod 升级到Vue3+ElementPlus 适配处理
  • 线程和进程的区别及基础线程创建
  • 为什么说TiDB在线扩容对业务几乎没有影响
  • c语言:贪吃蛇的实现
  • 知识图谱推理方法综述
  • 适用于嵌入式单片机的压缩算法
  • 使用gcc/g++查看C语言预处理,编译,汇编,连接,以及动静态库的区分