• posix多线程有感线程高级编程(线程属性函数总结)


    pthread_attr_t 的缺省属性值 

    属性

    结果

    scope

    PTHREAD_SCOPE_PROCESS

    新线程与进程中的其他线程发生竞争。

    detachstate

    PTHREAD_CREATE_JOINABLE

    线程退出后,保留完成状态和线程 ID

    stackaddr

    NULL

    新线程具有系统分配的栈地址。

    stacksize

    1M

    新线程具有系统定义的栈大小。

    priority

    0

    新线程的优先级为0。

    inheritsched

    PTHREAD_EXPLICIT_SCHED

    新线程不继承父线程调度优先级。

    schedpolicy

    SCHED_OTHER

    新线程对同步对象争用使用 Solaris 定义的固定优先级。线程将一直运行,直到被抢占或者直到线程阻塞或停止为止。

    guardsize

    PAGESIZE(4M)

    新线程具有系统定义的栈溢出保护区大小

    1、初始化一个线程对象的属性
    
    int pthread_attr_init(pthread_attr_t *attr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参: attr       指向一个线程属性的指针
    说  明:Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。
            pthread_attr_init实现时为属性对象分配了动态内存空间。
    2、销毁一个线程属性对象
    
    int pthread_attr_destroy(pthread_attr_t *attr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
    说  明:经pthread_attr_destroy去除初始化之后的pthread_attr_t结构被pthread_create函数调用,将会导致其返回错误。
    3、获取线程间的CPU亲缘性
    
    int pthread_attr_getaffinity_np(pthread_attr_t *attr, size_t cpusetsize, cpu_set_t *cpuset);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
    说  明:获取线程的CPU亲缘属性
    4、设置线程的CPU亲缘性
    
    int pthread_attr_setaffinity_np(pthread_attr_t *attr, size_t cpusetsize, const cpu_set_t *cpuset);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr         指向一个线程属性的指针
           cpusetsize   指向CPU组的缓冲区大小
           cpuset       指向CPU组的指针
    说  明:通过指定cupset来设置线程的CPU亲缘性
    5、获取线程分离状态属性
    
    int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
    返回值:若是成功返回0,否则返回错误的编号
    形  参: attr          指向一个线程属性的指针
            detachstate   保存返回的分离状态属性
    说  明:获取线程分离状态属性
    6、修改线程分离状态属性
    
    int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr        指向一个线程属性的指针
           detachstat  有两个取值
           PTHREAD_CREATE_DETACHED(分离)
          PTHREAD_CREATE_JOINABLE(非分离)
    说  明:所有的Pthreads系统都支持detachstate属性,该属性的值可以是PTHREAD_CREATE_DETACHED(分离)或PTHREAD_CREATE_JOINABLE(非分离)。默认的,线程被创建为非分离,即意味着由pthread_create创建的该线程ID能被用来与线程连接并获得它的返回值,或取消它。
    7、获取线程的栈溢出保护区大小
    
    int pthread_attr_getguardsize(pthread_attr_t *attr, size_t *guardsize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参: attr       指向一个线程属性的指针
            guardsize  返回获取的栈保护区大小
    说  明:获取线程的栈保护区大小。

    出于以下两个原因,为应用程序提供了 guardsize 属性:

    • 溢出保护可能会导致系统资源浪费。如果应用程序创建大量线程,并且已知这些线程永远不会溢出其栈,则可以关闭溢出保护区。通过关闭溢出保护区,可以节省系统资源。

    • 线程在栈上分配大型数据结构时,可能需要较大的溢出保护区来检测栈溢出。

    guardsize 参数提供了对栈指针溢出的保护。如果创建线程的栈时使用了保护功能,则实现会在栈的溢出端分配额外内存。此额外内存的作用与缓冲区一样,可以防止栈指针的栈溢出。如果应用程序溢出到此缓冲区中,这个错误可能会导致 SIGSEGV 信号被发送给该线程。

    8、设置线程的栈溢出保护区大小
    
    int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           guardsize  线程的栈保护区大小
    说  明:参数提供了对栈指针溢出的保护。如果 guardsize 为零,则不会为使用 attr 创建的线程提供溢出保护区。如果 guardsize 大于零,则会为每个使用attr 创建的线程提供大小至少为 guardsize 字节的溢出保护区。缺省情况下,线程具有实现定义的非零溢出保护区。将 guardsize 的值向上舍入为可配置的系统变量 PAGESIZE 的倍数。请参见 sys/mman.h 中的PAGESIZE
    9、获取线程的作用域
    
    int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           scope      返回线程的作用域
    说  明:指定了作用域也就指定了线程与谁竞争资源
    10、设置线程的作用域
    
    int pthread_attr_setscope(pthread_attr_t *attr, int scope);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           guardsize  线程的作用域,可以取如下值
           PTHREAD_SCOPE_SYSTEM    与系统中所有进程中线程竞争
           PTHREAD_SCOPE_PROCESS   与当前进程中的其他线程竞争
    说  明:指定了作用域也就指定了线程与谁竞争资源
    11、获取线程的堆栈信息(栈地址和栈大小)
    
    int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           stackaddr  返回获取的栈地址
           stacksize  返回获取的栈大小
    说  明:获取线程的堆栈地址和大小
    12、设置线程的堆栈信息(栈地址和栈大小)
    
    int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           stackaddr  线程的堆栈地址(低位地址):应该是可移植的,对齐页边距的可以用posix_memalign来进行获取。如果将 stackaddr 设置为非空值,而不是缺省的 NULL,则系统将在该地址初始化栈,假设大小为 stacksize。
           stacksize  线程的堆栈大小:应该是页大小的整数倍
    说  明:设置堆栈区,将导致pthread_attr_setguardsize失效。
    13、获取线程堆栈地址
    
    int pthread_attr_getstackaddr(pthread_attr_t *attr, void **stackaddr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           stackaddr  返回获取的栈地址
    说  明:函数已过时,一般用pthread_attr_getstack来代替
    14、设置线程堆栈地址
    
    int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           stackaddr  设置线程堆栈地址
    说  明:函数已过时,一般用pthread_attr_setstack来代替。
    15、获取线程堆栈大小
    
    int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           stacksize   返回线程的堆栈大小
    说  明:获取线程堆栈大小。设置堆栈大小不是可移植的。Pthreads定义PTHREAD_STACK_MIN标志,指定每个线程要求的最小栈大小,包含#include <limits.h>后可以通过打印其值查看。命令:#ulimit -s或者#ulimit -a其中stack size项表示堆栈大小。#ulimit -s value用来重新设置stack大小。默认为8M,最小16384字节
    注意:通常,线程栈是从页边界开始的。任何指定的大小都被向上舍入到下一个页边界。不具备访问权限的页将被附加到栈的溢出端。大多数栈溢出都会导致将 SIGSEGV 信号发送到违例线程。将直接使用调用方分配的线程栈,而不进行修改。指定栈时,还应用 PTHREAD_CREATE_JOINABLE 创建线程。在该线程的 pthread_join调用返回之前,不会释放该栈。在该线程终止之前,不会释放该线程的栈。一般情况下,不需要为线程分配栈空间。系统会为每个线程的栈分配 1 MB(对于 32 位系统)或 2 MB(对于 64 位系统)的虚拟内存,而不保留任何交换空间。系统将使用 mmap() 的 MAP_NORESERVE 选项来进行分配。极少数情况下需要指定栈和/或栈大小。甚至专家也很难了解是否指定了正确的大小。
    16、设置线程堆栈大小
    
    int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           stacksize  线程的堆栈大小(以字节为单位)应该是页大小的整数倍。(以字节为单位)。stacksize不应小于系统定义的最小栈大小。stacksize包含新线程使用的栈的字节数。如果 stacksize为零,则使用缺省大小。在大多数情况下,零值最适合。
    说  明:设置线程堆栈大小。
    17、获取线程的调度策略
    
    int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
    返回值:若是成功返回0,否则返回错误的编号
    形  参: attr       指向一个线程属性的指针
            policy     返回线程的调度策略
    说  明:获取线程的调度策略
    18、设置线程的调度策略
    
    int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           policy     线程的调度策略,有如下三种:
           SCHED_FIFO    先入先出策略
           SCHED_RR      轮转调度,类似于 FIFO,但加上了时间轮片算法
           SCHED_OTHER   系统默认策略。是不支持优先级使用的,而SCHED_FIFO和SCHED_RR支持优先级的使用,他们分别为1和99,数值越大优先级越高.
    注意:此处的SCHED_FIFO是允许被高优先级抢占的,也就是有高优先级的必须先运行。SCHED_RR是设置一个时间片。当有SCHED_FIFO或SCHED_RR策赂的线程在一个条件变量上等持或等持加锁同一个互斥量时,它们将以优先级顺序被唤醒。即,如果一个低优先级的SCHED_FIFO线程和一个高优先级的SCHED_FIFO线程都在等待锁相同的互斥量,则当互斥量被解锁时,高优先级线程将总是被首先解除阻塞。
    说  明:设置线程的调度策略
    19、设置线程的调度参数
    
    int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           param      返回获取的调度参数,该结构仅有一个从参数,如下
           struct sched_param 
         {
            int sched_priority; /* Scheduling priority */
         };
    说  明:设置线程的调度参数
    20、获取线程的调度参数
    
    int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           param      要设置的调度参数
    说  明:获取线程的调度参数
    21、获取线程是否继承调度属性
    
    int pthread_attr_getinheritsched(pthread_attr_t *attr, int *inheritsched);
    返回值:若是成功返回0,否则返回错误的编号
    形  参:attr       指向一个线程属性的指针
           guardsize  获取线程是否继承调度属性
           PTHREAD_INHERIT_SCHED:调度属性将继承于正创建的线程,attr中的设置将被忽略
           PTHREAD_EXPLICIT_SCHED 调度属性将被设置为attr中指定的属性值
    说  明:获取线程是否继承调度属性
    注意:当在属性对象中设置调度策略或优先级时,必须同时设置inheritsched属性(即继承属性设置为:PTHREAD_EXPLICIT_SCHED)。
  • 相关阅读:
    影响STA的因素-OCV
    FPGA的可靠性分析
    DFT
    Verilog 延时模型
    收缩数据库日志
    iis设置局域网访问,Context.Request.Url.Authority老是取出为localhost问题
    vs2012 后期生成事件命令报错 9009
    MIME配置
    sql 字符串拼接 =>for xml()
    js 切换embed的src值
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332838.html
Copyright © 2020-2023  润新知