侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

pthread_attr_setguardsize函数用法详解

noerror
2022-10-04 / 0 评论 / 0 点赞 / 163 阅读 / 759 字 / 正在检测是否收录...

pthread_attr_setguardsize函数用法详解

pthread_attr_setguardsize函数简介

  • 头文件包含
#include <pthread.h>
  • 函数定义
int pthread_attr_setguardsize(pthread_attr_t * attr \
int pthread_attr_getguardsize(const pthread_attr_t * attr ,
                              size_t * guardsize );
  • 编译链接选项
-pthread

pthread_attr_setguardsize函数常见使用错误

  • 链接错误
    undefined reference to `pthread_attr_setguardsize'
    解决办法:添加链接选项
-pthread
  • 编译错误
    warning: implicit declaration of function ‘pthread_attr_setguardsize’ [-Wimplicit-function-declaration]
    解决办法:包含头文件
#include <pthread.h>

pthread_attr_setguardsize函数详细描述

pthread_attr_setguardsize ()函数将attr引用的thread attributes对象的guard size属性设置为guardsize 中指定的值
如果guardsize大于0,那么对于使用attr创建的每个新线程,系统将在线程堆栈的末尾分配一个至少为guardsize字节的额外区域,作为堆栈的保护区域(但请参见bug)。
如果guardsize是0,那么用attr创建的新线程将没有保护区域。
默认保护大小与系统页大小相同。
如果在attr中设置了堆栈地址属性(使用pthread_attr_setstack (3)或pthread_attr_setstackaddr (3))表示调用方正在分配线程的堆栈,则忽略保护大小属性(即系统没有创建保护区域):应用程序有责任处理堆栈溢出(可能通过使用mprotect (2)在其分配的堆栈末尾手动定义一个保护区域)。
pthread_attr_getguardsize ()函数返回attr在guardsize 指向的缓冲区中引用的thread attributes对象的guard size属性

pthread_attr_setguardsize函数返回值

如果成功,这些函数返回0;错误时,它们返回一个非零错误号。

pthread_attr_setguardsize函数错误码

如果attr或guardsize无效,POSIX.1将记录 EINVAL 错误。在Linux上,这些函数总是成功的(但是,可移植的和将来可靠的应用程序仍然应该处理可能的错误返回)。

pthread_attr_setguardsize函数其他说明

保护区域由虚拟内存页组成,这些页受到保护以防止读写访问。如果一个线程将其堆栈溢出到保护区域,那么在大多数硬体系结构上,它会收到一个 SIGSEGV 信号,从而通知它溢出。保护区域从页边界开始,在创建线程时,保护大小在内部四舍五入到系统页大小。(然而,pthread_attr_getguardsize ()返回由pthread_attr_setguardsize ())设置的保护大小。)
在创建许多线程并且知道永远不会发生堆栈溢出的应用程序中,将保护大小设置为0可能有助于节省内存。
如果线程在堆栈上分配了大型数据结构,则可能需要选择大于默认大小的保护大小来检测堆栈溢出。

pthread_attr_setguardsize函数使用举例

参见pthread_getattr_np (3)

0

评论区