zoukankan      html  css  js  c++  java
  • 线程基本函数

    • 线程库没有包含在系统库中,编译时要进行链接  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为需要执行一次的函数,用户自己写

      

  • 相关阅读:
    Oracle 导入导出 创建用户等
    如何导出 Windows EventLog
    QT connect 的信号,不能写类名
    Easylogging
    Openstack Swift SLO & bulk delete 测试常用命令,文件等
    Openstack Swift Static Large Object (SLO)
    Linux 创建指定大小的文件
    Openstack Swiftclient 查看 log
    Openstack Swift 批量删除 (bulk delete)
    winsock server 示例代码中 shutdown 的选项
  • 原文地址:https://www.cnblogs.com/edan/p/8945518.html
Copyright © 2011-2022 走看看