zoukankan      html  css  js  c++  java
  • 线程

      在线程代码中,这个特殊的执行流被称为“初始线程”或“主线程”(mian函数中的线程)。初始线程的特殊性在于main函数返回阶段保留了传统UNIX进程行为,即进程结束时不会等待其他线程结束。从main函数返回将导致进程终止,也将使进程内所有的线程终止。可以在main函数中调用pthread_exit,这样进程就必须等到所有线程结束后才能终止。

    #include <pthread.h>
    
    int pthread_equal(pthread_t tid1, pthread_t tid2);//若相等则返回非0值,否则返回0
    
    int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr,void *(*start_rtn)(void), void *restrict arg);
    //tidp:获取新创建线程的线程ID,attr:线程属性,start_rtn:新创建的线程从start_rtn函数的地址开始运行,arg:start_rtn的指针参数
    //若成功则返回0,否则返回错误编号
    
    void pthread_t pthread_self(void);//返回调用线程的线程ID
    
    void pthread_exit(void *rval_ptr);//rval_ptr:保存线程退出后返回的值
    
    int pthread_join(pthread_t thread, void **rval_ptr);//若成功返回0,否则返回错误编码
    
    int pthread_detach(pthread_t tid);//若成功返回0,否则返回错误编号
    //使线程进入分离状态。分离一个正在运行的线程不会对线程带来任何影响,仅仅是通知系统当该线程结束时,其所属资源可以被回收。
    1. 线程创建时并不能保证哪个线程会先运行:是新创建的线程还是调用线程。新创建的线程可以访问进程的地址空间,并且继承调用线程的浮点环境和信号屏蔽字,但是该线程的未决信号集被清除。
    2. 一个没有被分离的线程终止时会保留其虚拟内存,包括他们的堆栈和其他系统资源。分离线程意味着通知系统不再需要此线程。允许系统将分配给它的资源回收;(避免内存泄露)
    3. 让线程返回某个值,即时该值为空,如果忽略返回语句,pthread_join还是会返回某个值,不论线程保存返回值的地方(可能是寄存器)保存了什么数据都会被返回
    4. 还可以通过信号SIGEV_THREAD创建线程
    5. 在当前线程从函数pthread_create中返回以及新线程被调度执行之间不存在同步关系。即,新线程可能在当前线程从pthread_create返回之前就运行了,甚至在当前线程从pthread_create返回之前,新线程就可能已经运行完毕
    6. 线程被回收后,线程ID无效不可再被使用。线程终止后其系统和进程资源,返回值内存空间,堆栈,寄存器状态等资源不可再被使用。如一个线程将其堆栈空间通过指针传递给另一线程,当该线程终止后,上述资源不可再用

    线程属性

    pthread_attr_t attr;
    int pthread_attr_init(pthread_attr_t *attr);//调用成功完成后将返回零,其它返回值表示出错
    int pthread_attr_destroy(pthread_attr_t *tattr);//调用成功完成后将返回零,其它返回值表示出错 
    //设置/获取分离状态
    int pthread_attr_setdetachstate(pthread_attr_t *tattr,int* detachstate);//调用成功完成后将返回零,其它返回值表示出错
    int pthread_attr_getdetachstate(const pthread_attr_t *tattr, int *detachstate);//调用成功完成后将返回零,其它返回值表示出错  
    //设置/获取栈溢出保护区大小
    int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
    int pthread_attr_getguardsize(const pthread_attr_t *attr,size_t *guardsize);
    //设置/获取线程并行级别
    int pthread_setconcurrency(int new_level);  
    int pthread_getconcurrency(void);
    //设置/获取栈大小
    int pthread_attr_setstacksize(pthread_attr_t *tattr, size_t size);//调用成功完成后将返回零,其它返回值表示出错
    int pthread_attr_getstacksize(pthread_attr_t *tattr, size_t *size);//调用成功完成后将返回零,其它返回值表示出 
    1. 线程默认的连接属性是PTHREAD_CREATE_JOINABLE
    2. 线程堆栈大小不可移植,PTHREAD_STACK_MIN指定线程栈最小大小,从上向下的地址空间指定的地址是栈的最高地址而不是最低地址,如果增大栈需指定最低地址。该属性移植性不好
  • 相关阅读:
    static关键字(C语言)
    PartitionerTest
    PipelineTest
    ReadDataFromCheckpoint
    Demo1
    CacheTest
    CheckPointTest
    BroadCast
    AccumulatorOperator
    Operator_takeAndFirst
  • 原文地址:https://www.cnblogs.com/tianzeng/p/8934060.html
Copyright © 2011-2022 走看看