线程基本函数

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

  

原文地址:https://www.cnblogs.com/edan/p/8945518.html