pthread_attr_init(3) - wariua/manpages-ko GitHub Wiki
pthread_attr_init, pthread_attr_destroy - μ€λ λ μμ± κ°μ²΄ μ΄κΈ°ν λ° νκΈ°
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
-pthread
λ‘ μ»΄νμΌ λ° λ§ν¬.
pthread_attr_init()
ν¨μλ attr
μ΄ κ°λ¦¬ν€λ μ€λ λ μμ± κ°μ²΄λ₯Ό κΈ°λ³Έ μμ± κ°λ€λ‘ μ΄κΈ°ν νλ€. μ΄ νΈμΆ λ€μμ (SEE ALSOμ λμ΄λ) μ¬λ¬ κ΄λ ¨ ν¨μλ€μ μ¨μ κ°μ²΄μ κ°λ³ μμ±μ μ€μ ν μ μμΌλ©°, κ·Έλ¬κ³ λμ κ·Έ κ°μ²΄λ₯Ό μ€λ λλ₯Ό μμ±νλ pthread_create(3) νΈμΆμ ν λ² λλ κ·Έ μ΄μ μ¬μ©ν μ μλ€.
μ΄λ―Έ μ΄κΈ°ν λ μ€λ λ μμ± κ°μ²΄μ pthread_attr_init()
μ νΈμΆνλ κ²°κ³Όλ κ·μ λμ΄ μμ§ μλ€.
μ€λ λ μμ± κ°μ²΄κ° λλ νμμΉ μμΌλ©΄ pthread_attr_destroy()
ν¨μλ₯Ό μ΄μ©ν΄ νκΈ°ν΄μΌ νλ€. μ€λ λ μμ± κ°μ²΄ νκΈ°λ κ·Έ κ°μ²΄λ‘ μμ±λ μ€λ λμ μ΄λ€ μν₯λ μ£Όμ§ μλλ€.
μ€λ λ μμ± κ°μ²΄λ₯Ό νκΈ°νκ³ λλ©΄ pthread_attr_init()
μΌλ‘ λ€μ μ΄κΈ°ν ν μ μλ€. νκΈ°λ μ€λ λ μμ± κ°μ²΄λ₯Ό κ·Έ μΈ μ΄λ€ λ°©μμΌλ‘λ μ°λ κ²°κ³Όλ κ·μ λμ΄ μμ§ μλ€.
μ±κ³΅ μ μ΄ ν¨μλ€μ 0μ λ°ννλ€. μ€λ₯ μ 0 μλ μ€λ₯ λ²νΈλ₯Ό λ°ννλ€.
POSIX.1μμλ pthread_attr_init()
μ ENOMEM
μ€λ₯λ μ κ³ μλ€. 리λ
μ€μμλ μ΄ ν¨μλ€μ΄ νμ μ±κ³΅νλ€. (κ·Έλ κΈ°λ νμ§λ§ μ΄μ κ°λ₯νκ³ λ―Έλλ₯Ό λλΉνλ μμ©μμλ κ°λ₯ν μ€λ₯ λ°νμ μ²λ¦¬ν΄μΌ ν κ²μ΄λ€.)
μ΄ μ μμ μ¬μ©νλ μ©μ΄λ€μ λν μ€λͺ μ attributes(7)λ₯Ό 보λΌ.
μΈν°νμ΄μ€ | μμ± | κ° |
---|---|---|
pthread_attr_init() ,pthread_attr_destroy()
|
μ€λ λ μμ μ± | MT-Safe |
POSIX.1-2001, POSIX.1-2008.
pthread_attr_t
νμ
μ λΆν¬λͺ
ν κ²μΌλ‘ μ·¨κΈν΄μΌ νλ€. pthreads ν¨μλ₯Ό ν΅νμ§ μμ λ°©μμΌλ‘ κ°μ²΄μ μ κ·Όνλ κ²μ μ΄μμ±μ΄ μμΌλ©° κ·μ λμ§ μμ κ²°κ³Όλ₯Ό μ λ°νλ€.
μλ νλ‘κ·Έλ¨μμλ μ νμ μΌλ‘ pthread_attr_init()
κ³Ό μ¬λ¬ κ΄λ ¨ ν¨μλ€μ μ΄μ©ν΄ μ€λ λ μμ± κ°μ²΄λ₯Ό μ΄κΈ°ννκ³ μ€λ λ ν κ°λ₯Ό μμ±νλ€. μμ±λ μ€λ λλ pthread_getattr_np(3) ν¨μ(λΉνμ€ GNU νμ₯)λ‘ μ€λ λμ μμ±μ μ»μ΄ μμ κ·Έ μμ±λ€μ νμνλ€.
λͺ
λ Ήν μΈμ μμ΄ νλ‘κ·Έλ¨μ μ€ννλ©΄ pthread_create(3)μ attr
μΈμλ‘ NULLμ μ λ¬νλ©°, κ·Έλμ κΈ°λ³Έ μμ±μΌλ‘ μ€λ λλ₯Ό μμ±νλ€. NPTL μ€λ λ© κ΅¬νμ΄ μλ 리λ
μ€/x86-32μμ νλ‘κ·Έλ¨μ λ리면 λ€μκ³Ό κ°μ΄ λμ¨λ€.
$ ulimit -s # μ€ν μ ν μμ ==> κΈ°λ³Έ μ€ν ν¬κΈ° 2MB
unlimited
$ ./a.out
Thread attributes:
Detach state = PTHREAD_CREATE_JOINABLE
Scope = PTHREAD_SCOPE_SYSTEM
Inherit scheduler = PTHREAD_INHERIT_SCHED
Scheduling policy = SCHED_OTHER
Scheduling priority = 0
Guard size = 4096 bytes
Stack address = 0x40196000
Stack size = 0x201000 bytes
λͺ λ Ήν μΈμλ‘ μ€ν ν¬κΈ°λ₯Ό μ£Όλ©΄ νλ‘κ·Έλ¨μμ μ€λ λ μμ± κ°μ²΄λ₯Ό μ΄κΈ°ν νκ³ , κ·Έ κ°μ²΄μ μ¬λ¬ μμ±λ€μ μ€μ νκ³ , κ·Έ κ°μ²΄μ λν ν¬μΈν°λ₯Ό pthread_create(3) νΈμΆμ μ λ¬νλ€. NTPL μ€λ λ© κ΅¬νμ΄ μλ 리λ μ€/x86-32μμ νλ‘κ·Έλ¨μ λ리면 λ€μκ³Ό κ°μ΄ λμ¨λ€.
$ ./a.out 0x3000000
posix_memalign() allocated at 0x40197000
Thread attributes:
Detach state = PTHREAD_CREATE_DETACHED
Scope = PTHREAD_SCOPE_SYSTEM
Inherit scheduler = PTHREAD_EXPLICIT_SCHED
Scheduling policy = SCHED_OTHER
Scheduling priority = 0
Guard size = 0 bytes
Stack address = 0x40197000
Stack size = 0x3000000 bytes
#define _GNU_SOURCE /* pthread_getattr_np() μ μΈμ μν΄ */
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void
display_pthread_attr(pthread_attr_t *attr, char *prefix)
{
int s, i;
size_t v;
void *stkaddr;
struct sched_param sp;
s = pthread_attr_getdetachstate(attr, &i);
if (s != 0)
handle_error_en(s, "pthread_attr_getdetachstate");
printf("%sDetach state = %s\n", prefix,
(i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" :
(i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" :
"???");
s = pthread_attr_getscope(attr, &i);
if (s != 0)
handle_error_en(s, "pthread_attr_getscope");
printf("%sScope = %s\n", prefix,
(i == PTHREAD_SCOPE_SYSTEM) ? "PTHREAD_SCOPE_SYSTEM" :
(i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" :
"???");
s = pthread_attr_getinheritsched(attr, &i);
if (s != 0)
handle_error_en(s, "pthread_attr_getinheritsched");
printf("%sInherit scheduler = %s\n", prefix,
(i == PTHREAD_INHERIT_SCHED) ? "PTHREAD_INHERIT_SCHED" :
(i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" :
"???");
s = pthread_attr_getschedpolicy(attr, &i);
if (s != 0)
handle_error_en(s, "pthread_attr_getschedpolicy");
printf("%sScheduling policy = %s\n", prefix,
(i == SCHED_OTHER) ? "SCHED_OTHER" :
(i == SCHED_FIFO) ? "SCHED_FIFO" :
(i == SCHED_RR) ? "SCHED_RR" :
"???");
s = pthread_attr_getschedparam(attr, &sp);
if (s != 0)
handle_error_en(s, "pthread_attr_getschedparam");
printf("%sScheduling priority = %d\n", prefix, sp.sched_priority);
s = pthread_attr.getguardsize(attr, &v);
if (s != 0)
handle_error_en(s, "pthread_attr_getguardsize");
printf("%sGuard size = %zu bytes\n", prefix, v);
s = pthread_attr_getstack(attr, &stkaddr, &v);
if (s != 0)
handle_error_en(s, "pthread_attr_getstack");
printf("%sStack address = %p\n", prefix, stkaddr);
printf("%sStack size = 0x%zx bytes\n", prefix, v);
}
static void *
thread_start(void *arg)
{
int s;
pthread_attr_t gattr;
/* pthread_getattr_np()λ λΉνμ€ GNU νμ₯μ΄λ©°
첫 λ²μ§Έ μΈμμ μ§μ ν μ€λ λμ μμ±λ€μ κ°μ Έμ΄ */
s = pthread_getattr_np(pthread_self(), &gattr);
if (s != 0)
handle_error_en(s, "pthread_getattr_np");
printf("Thread attributes:\n");
display_pthread_attr(&gattr, "\t");
exit(EXIT_SUCCESS); /* λͺ¨λ μ€λ λ μ’
λ£ */
}
int
main(int argc, char *argv[])
{
pthread_t thr;
pthread_attr_t attr;
pthread_attr_t *attrp; /* NULL λλ &attr */
int s;
attrp = NULL;
/* λͺ
λ Ήν μΈμκ° μμΌλ©΄ κ·Έ κ°μΌλ‘ μ€ν ν¬κΈ° μμ±μ μ€μ νκ³
λ€λ₯Έ λͺ κ°μ§ μ€λ λ μμ±λ€μ μ€μ ν λ€μ attrpκ° κ·Έ
μ€λ λ μμ± κ°μ²΄λ₯Ό κ°λ¦¬ν€λλ‘ μ€μ */
if (argc > 1) {
int stack_size;
void *sp;
attrp = &attr;
s = pthread_attr_init(&attr);
if (s != 0)
handle_error_en(s, "pthread_attr_init");
s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (s != 0)
handle_error_en(s, "pthread_attr_setdetachstate");
s = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
if (s != 0)
handle_error_en(s, "pthread_attr_setinheritsched");
stack_size = strtoul(argv[1], NULL, 0);
s = posix_memalign(&sp, sysconf(_SC_PAGESIZE), stack_size);
if (s != 0)
handle_error_en(s, "posix_memalign");
printf("posix_memalign() allocated at %p\n", sp);
s = pthread_attr_setstack(&attr, sp, stack_size);
if (s != 0)
handle_error_en(s, "pthread_attr_setstack");
}
s = pthread_create(&thr, attrp, &thread_start, NULL);
if (s != 0)
handle_error_en(s, "pthread_create");
if (attrp != NULL) {
s = pthread_attr_destroy(attrp);
if (s != 0)
handle_error_en(s, "pthread_attr_destroy");
}
pause(); /* λ€λ₯Έ μ€λ λμμ exit() νΈμΆν λ μ’
λ£ */
}
pthread_attr_setaffinity_np(3), pthread_attr_setdetachstate(3), pthread_attr_setguardsize(3), pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_attr_setscope(3), pthread_attr_setstack(3), pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_create(3), pthread_getattr_np(3), pthread_setattr_default_np(3), pthreads(7)
2019-03-06