如何在创建线程时设置stack_size,stack_addr和guardsize

时间:2012-05-10 08:26:39

标签: c pthreads posix

这些天我正在阅读APUE,并且发现了一个问题。

使用pthread_attr_setstack的一种常用方法是

  1. malloc记忆
  2. 通过方法
  3. 设置addrlength

    然后,我的问题就出现了,如果我想使用guard-size来保护我的数据呢?假设我需要A个字节的内存,B个字节用于guard-size。

    我应该malloc A+B个字节,还是malloc A个字节?

1 个答案:

答案 0 :(得分:0)

实际上,pthread库本身为set the guard size

提供了一个API
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);

但请注意,如果您使用pthread_attr_setstack(3)pthread_attr_setstackaddr(3)之类的函数设置堆栈位置或大小,则会忽略保护区域属性(即,没有保护区域是由系统创建):您有责任处理堆栈溢出(可能通过使用mprotect(2)在您已分配的堆栈末尾手动定义保护区域。

因此,针对您的具体问题,是的,如果您希望使用A+B,则需要malloc pthread_attr_setstack个字节来自己包含警戒区域。另外,如果你对默认的堆栈大小没问题,那么你可以使用pthread_attr_setstack函数。

在此处阅读pthreads。另请参阅Stack Management

部分下的线程堆栈管理here