错误说明

pthread_attr_setstack()可能因以下错误而失败:

EINVAL
stacksize小于PTHREAD_STACK_MIN(16384)字节。在某些系统上,如果stackaddr或stackaddr + stacksize未适当对齐,也可能会发生此错误。

如果由stackaddr和stacksize描述的堆栈区域不能被调用者读写,则POSIX.1还记录了EACCES错误。

说明

pthread_attr_setstack()函数将attr引用的线程属性对象的堆栈地址和堆栈大小属性分别设置为stackaddr和stacksize中指定的值。这些属性指定使用线程属性对象attr创建的线程应使用的堆栈的位置和大小。

stackaddr应该指向调用者分配的stacksize字节缓冲区的最低可寻址字节。分配的缓冲区的页应该是可读写的。

pthread_attr_getstack()函数分别在stackaddr和stacksize所指向的缓冲区中返回attr所引用的线程属性对象的堆栈地址和堆栈大小属性。

版本

从2.2版开始,这些功能由glibc提供。

示例

请参见pthread_attr_init(3)。

PTHREAD_ATTR_SETSTACK - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-06-09

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
pthread_attr_setstack(),pthread_attr_getstack()Thread safetyMT-Safe

备注

这些功能是为必须确保将线程的堆栈放置在特定位置的应用程序提供的。对于大多数应用程序来说,这不是必需的,应避免使用这些功能。 (如果应用程序只需要默认大小以外的堆栈大小,则使用pthread_attr_setstacksize(3)。)

当应用程序使用pthread_attr_setstack()时,它将接管分配堆栈的责任。使用pthread_attr_setguardsize(3)设置的任何防护大小值都将被忽略。如果认为有必要,则应用程序有责任分配一个保护区域(一个或多个页面以防止读写),以处理堆栈溢出的可能性。

stackaddr中指定的地址应适当对齐:为了完全可移植,请将其在页面边界上对齐(sysconf(_SC_PAGESIZE))。 posix_memalign(3)可能对分配有用。可能,堆栈大小也应该是系统页面大小的倍数。

如果使用attr创建多个线程,则调用者必须在两次调用pthread_create(3)之间更改堆栈地址属性。否则,线程将尝试为其堆栈使用相同的内存区域,从而将导致混乱。

语法

#include <pthread.h>

int pthread_attr_setstack(pthread_attr_t *attr,
                          void *stackaddr, size_t stacksize);
int pthread_attr_getstack(const pthread_attr_t *attr,
                          void **stackaddr, size_t *stacksize);

Compile and link with -pthread.

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

pthread_attr_getstack(),pthread_attr_setstack():

_POSIX_C_SOURCE>= 200112L

返回值

成功时,这些函数返回0;否则,返回0。错误时,它们返回非零错误号。

名称

pthread_attr_setstack,pthread_attr_getstack-在线程属性对象中设置/获取堆栈属性

遵循规范

POSIX.1-2001,POSIX.1-2008。

日期:2019-08-20 18:01:01 来源:oir作者:oir