pthread_attr_getguardsize 或 pthread_attr_setguardsize 子例程

用途

获取或设置线程 guardsize 属性。

线程库libthreads.a

语法

#include <pthread.h>

int pthread_attr_getguardsize (attr, guardsize)
const pthread_attr_t *attr;
size_t *guardsize;

int pthread_attr_setguardsize (attr, guardsize)
pthread_attr_t *attr;
size_t guardsize;

描述

guardsize 属性控制所创建线程的堆栈的警戒区域的大小。 guardsize 属性提供针对堆栈指针溢出的保护。 如果线程的堆栈是使用警戒保护创建的,那么实现会在堆栈的溢出端分配额外的内存作为针对堆栈指针的堆栈溢出的缓冲区。 如果应用程序溢出到此缓冲区,那么会导致错误 (可能是 SIGSEGV 信号被传递到线程中)。

向应用程序提供 guardsize 属性有两个原因:

  • 溢出保护可能导致系统资源浪费。 如果一个应用程序创建了大量线程,并且知道其线程永远不会溢出堆栈,那么就可以通过关闭保护区域来节省系统资源。
  • 当线程在堆栈上分配大型数据结构时,可能需要大型保护区域来检测堆栈溢出。

pthread_attr_getguardsize函数获取attr 对象中的 guardsize 属性。 该属性在 guardsize参数中返回。

pthread_attr_setguardsize函数用于设置attr 对象中的 guardsize 属性。 该属性的新值从guardsize参数中获取。 如果guardsize为零,则不会为使用 attr 创建的线程提供保护区域。 如果guardsize大于零,则会为使用 attr 创建的每个线程提供至少大小为 guardsize 字节的保护区域。

允许符合要求的实现将guardsize中包含的值四舍五入为可配置系统变量 PAGESIZE 的倍数(参见sys/mman.h)。 如果实现将 guardsize 的值四舍五入为 PAGESIZE 的倍数,那么调用pthread_attr_getguardsize并指定attr 时,将在guardsize参数中存储上一次pthread_attr_setguardsize函数调用所指定的 guard 大小。 guardsize 属性的缺省值为 PAGESIZE 字节。 PAGESIZE 的实际值依赖于实现,并且在所有实现上可能不相同。

如果已设置 stackaddr 属性 (即,调用者正在分配和管理其自己的线程堆栈) ,那么将忽略 guardsize 属性,并且实现不会提供保护。 在这种情况下,应用程序负责管理堆栈溢出以及堆栈分配和管理。

参数

描述
attr 指定线程属性对象。
Guardsize 控制所创建线程的堆栈的保护区域大小,并防止堆栈指针溢出。

返回值

如果成功,pthread_attr_getguardsizepthread_attr_setguardsize函数返回 0。 否则,将返回错误号以指示错误。

错误代码

如果出现以下情况,pthread_attr_getguardsizepthread_attr_setguardsize函数将失效:

描述
EINVAL 属性attr 无效。
EINVAL guardsize 参数无效。
EINVAL guardsize 参数包含无效值。