NAME

pthread_attr_setstack, pthread_attr_getstack - 스레드 속성 객체의 스택 속성 설정하기/얻기

SYNOPSIS

#include <pthread.h>

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

-pthread로 컴파일 및 링크.

glibc 기능 확인 매크로 요건 (feature_test_macros(7) 참고):

pthread_attr_getstack(), pthread_attr_setstack():
_POSIX_C_SOURCE >= 200112L

DESCRIPTION

pthread_attr_setstack() 함수는 attr이 가리키는 스레드 속성 객체의 스택 주소 및 스택 크기 속성을 각각 stackaddrstacksize에 지정한 값들로 설정한다. 이 속성들은 스레드 속성 객체 attr을 이용해 생성하는 스레드에서 사용할 스택의 위치와 크기를 나타낸다.

stackaddr은 호출자가 할당한 stacksize 바이트짜리 버퍼에서 가장 아래 주소의 바이트를 가리켜야 한다. 할당한 버퍼의 페이지들은 읽기와 쓰기가 모두 가능해야 한다.

pthread_attr_getstack() 함수는 attr이 가리키는 스레드 속성 객체의 스택 주소 및 스택 크기 속성을 각각 stackaddrstacksize가 가리키는 버퍼로 반환한다.

RETURN VALUE

성공 시 이 함수들은 0을 반환한다. 오류 시 0 아닌 오류 번호를 반환한다.

ERRORS

pthread_attr_setstack()이 다음 오류로 실패할 수 있다.

EINVAL
stacksizePTHREAD_STACK_MIN(16384)바이트보다 작다. 일부 시스템에서는 stackaddr이나 stackaddr + stacksize가 올바로 정렬되어 있지 않은 경우에도 이 오류가 발생할 수 있다.

POSIX.1에서는 stackaddrstacksize가 기술하는 스택이 호출자에게 읽기와 쓰기 모두 가능하지 않은 경우 EACCES 오류도 적고 있다.

VERSIONS

glibc 버전 2.2부터 이 함수들을 제공한다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
pthread_attr_setstack(),
pthread_attr_getstack()
스레드 안전성 MT-Safe

CONFORMING TO

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

NOTES

이 함수들은 스레드의 스택이 특정 위치에 있도록 해야 하는 응용들을 위한 것이다. 대부분 응용에서는 그럴 필요가 없으므로 이 함수들을 쓰지 않는 게 좋다. (응용에서 필요한 게 기본과 다른 스택 크기일 뿐이라면 pthread_attr_setstacksize(3)를 쓰면 된다.)

응용에서 pthread_attr_setstack()을 이용할 때는 스택을 할당할 책임을 함께 가져간다. pthread_attr_setguardsize(3)로 설정한 방호 구역 크기 값이 무시된다. 필요시 스택 오버플로 가능성에 대처하기 위해 방호 구역(읽기 및 쓰기가 안 되게 보호된 한 개 이상의 페이지)을 할당하는 것은 응용의 몫이다.

stackaddr로 지정하는 주소가 적절히 정렬되어 있는 게 좋다. 완전한 이식성을 위해선 페이지 경계(sysconf(_SC_PAGESIZE))에 맞춰 정렬하면 된다. 할당에 posix_memalign(3)이 도움이 될 수 있다. stacksize 역시도 시스템 페이지 크기의 배수로 하는 게 좋을 것이다.

attr을 사용해 여러 스레드를 생성하는 경우에 호출자는 pthread_create(3) 호출들 간에 스택 주소 속성을 바꿔 주어야 한다. 안 그러면 여러 스레드가 같은 메모리 구역을 스택으로 쓰려고 하면서 혼란이 뒤따를 것이다.

EXAMPLES

pthread_attr_init(3) 참고.

SEE ALSO

mmap(2), mprotect(2), posix_memalign(3), pthread_attr_init(3), pthread_attr_setguardsize(3), pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_create(3), pthreads(7)


2021-03-22