• 线程基本函数


    • 线程库没有包含在系统库中,编译时要进行链接  gcc -l pthread
    • 线程包括主线程和次线程,线程时平等的,共享数据短,栈空间,唯一不同的是栈空间不同
    • tid不要打印

    2.pthread_cread(tid,&attr,func,&arg)  //成功返回0,错误返回错误码

      tid:线程id号;attr:线程属性(大多填写NULL,后面会祥解)

      func:启动例程;args:启动例程的参数

      如:pthread_create(tid,NULL,doWork,NULL);

    3.pthread_join(tid,void **retval)

      功能:等待线程号为tid的线程执行结束后回收线程资源,类似于进程的wait()函数,会阻塞。任何一个线程都可以回收其他线程

      tid:等待回收的线程

      retval:1.可以作为线程结束返回码。判断线程是否正常结束

          2.接收线程结束时的返回的数据空间

    4.pthread_exit(void *retval)

      功能:结束线程,并返回结束码:可以用0,1表示线程是否正常返回

      也可以返回一个数据的地址,方便其他线程调用

    5.Pthread_cancel(tid)  //成功返回0,失败返回erro

      功能:对线程号为tid的线程发送取消请求

      注:发送成功并不代表线程tid就会结束

      原因:每个线程都有取消选项,是相应取消请求要看取消选项。

      取消选项包括:可取消状态可取消类型

    可取消状态包含两种:

    • PTHREAD_CANCEL_ENABLE:可以被取消,但是具体行为还要看取消类型
    • PTHREAD_CANCEL_DISABLE:不可以被取消

      pthread_setcancelstate()://设置线程取消状态

    可取消类型也包括两种

    • PTHREAD_CANCEL_DEFERRED      延迟取消(调用pthread_cancel并不会立即终止线程,而是继续运行,达到某个取消点时才终止)
    • PTHREAD_CANCEL_ASYNCHRONOUS    导步取消(线程可以在任何时间取消)

      pthread_setcanceltype()   //设置线程取消类型(理解:类似于进程上锁的机制,在这期间是不能被取消的,保证数据完整)

      pthread_testcancel()  //设置取消点

    6.pthread_self(void)//获取线程id号

    7.pthread_equal(pthread_t tid1,pthread_t tid2);//比较两个线程的id号,相等返回0,失败返回非0

    8.线程退出时可以调用安排好的退出清理程序(类似于atexit)

      void pthread_cleanup_push(void (*rtn)(void *),void *arg);//将清理程序入栈(清理程序安装)
           //execute为0弹出不执行 非0弹出并执行
      void pthread_cleanup_pop(int execute);   //这两个函数成对出现,pop()可以写在return后面不执行,但必须要写。

      注:当执行以下动作时调用清理函数
          .调用pthread_exit
          .响应取消请求
          .execute非零调用pop

    9.   int pthread_detach(pthread_t tid); //如果不关心线程返回状态,可以使线程进入分离状态,分离的线程退出时,底层资源会立即回收,不需要再调用pthread_join()来回收资源,

    10.线程属性

    1. 线程的分离状态属性  :可以用函数pthread_detach()函数来代替
    2. 线程的栈未尾警戒缓冲区大小 
    3. 线程栈最低地址
    4. 线程栈大小:    当有多个线程高并发时需要设置该属性

        指定stack大小不能小于       #define PTHREAD_STACK_MIN       16384   

       int pthread_attr_getstack(const pthread_attr_t *attr,void **stackaddr,void*size);
      int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr,int size);//设置栈大小,但需要自  己申请一块未使用的空间

    int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);//设置栈大小,系统自动分配空间

     11.pthread_once()//在多线程中保证某件事情只被执行一次

      初始化变量

        pthread_once_t  one=PTHREAD_ONCE_INIT;

        //在线程的启动例程中调用,无论哪个线程执行,都只会执行一次

        pthread_once(&one,onceEvent); //onecEvent为需要执行一次的函数,用户自己写

      

  • 相关阅读:
    centos安装配置jdk
    java封装数据类型——Byte
    centos7安装mysql8
    centos安装redis
    centos源码安装nginx
    Linux查看系统及版本信息
    sqlyog无操作一段时间后重新操作会卡死问题
    mysql8中查询语句表别名不能使用 “of”
    一次腾讯云centos服务器被入侵的处理
    java封装数据类型——Long
  • 原文地址:https://www.cnblogs.com/edan/p/8945518.html
Copyright © 2020-2023  润新知