pthread_attr_init(3) - wariua/manpages-ko GitHub Wiki

NAME

pthread_attr_init, pthread_attr_destroy - μŠ€λ ˆλ“œ 속성 객체 μ΄ˆκΈ°ν™” 및 파기

SYNOPSIS

#include <pthread.h>

int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);

-pthread둜 컴파일 및 링크.

DESCRIPTION

pthread_attr_init() ν•¨μˆ˜λŠ” attr이 κ°€λ¦¬ν‚€λŠ” μŠ€λ ˆλ“œ 속성 객체λ₯Ό κΈ°λ³Έ 속성 κ°’λ“€λ‘œ μ΄ˆκΈ°ν™” ν•œλ‹€. 이 호좜 λ‹€μŒμ— (SEE ALSO에 λ‚˜μ—΄λœ) μ—¬λŸ¬ κ΄€λ ¨ ν•¨μˆ˜λ“€μ„ μ¨μ„œ 객체의 κ°œλ³„ 속성을 μ„€μ •ν•  수 있으며, 그러고 λ‚˜μ„œ κ·Έ 객체λ₯Ό μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” pthread_create(3) ν˜ΈμΆœμ— ν•œ 번 λ˜λŠ” κ·Έ 이상 μ‚¬μš©ν•  수 μžˆλ‹€.

이미 μ΄ˆκΈ°ν™” 된 μŠ€λ ˆλ“œ 속성 객체에 pthread_attr_init()을 ν˜ΈμΆœν•˜λŠ” κ²°κ³ΌλŠ” κ·œμ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

μŠ€λ ˆλ“œ 속성 객체가 λ”λŠ” ν•„μš”μΉ˜ μ•ŠμœΌλ©΄ pthread_attr_destroy() ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ νŒŒκΈ°ν•΄μ•Ό ν•œλ‹€. μŠ€λ ˆλ“œ 속성 객체 νŒŒκΈ°λŠ” κ·Έ 객체둜 μƒμ„±λœ μŠ€λ ˆλ“œμ— μ–΄λ–€ 영ν–₯도 μ£Όμ§€ μ•ŠλŠ”λ‹€.

μŠ€λ ˆλ“œ 속성 객체λ₯Ό νŒŒκΈ°ν•˜κ³  λ‚˜λ©΄ pthread_attr_init()으둜 λ‹€μ‹œ μ΄ˆκΈ°ν™” ν•  수 μžˆλ‹€. 파기된 μŠ€λ ˆλ“œ 속성 객체λ₯Ό κ·Έ μ™Έ μ–΄λ–€ λ°©μ‹μœΌλ‘œλ“  μ“°λŠ” κ²°κ³ΌλŠ” κ·œμ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

RETURN VALUE

성곡 μ‹œ 이 ν•¨μˆ˜λ“€μ€ 0을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œ 0 μ•„λ‹Œ 였λ₯˜ 번호λ₯Ό λ°˜ν™˜ν•œλ‹€.

ERRORS

POSIX.1μ—μ„œλŠ” pthread_attr_init()에 ENOMEM 였λ₯˜λ„ 적고 μžˆλ‹€. λ¦¬λˆ…μŠ€μ—μ„œλŠ” 이 ν•¨μˆ˜λ“€μ΄ 항상 μ„±κ³΅ν•œλ‹€. (κ·Έλ ‡κΈ°λŠ” ν•˜μ§€λ§Œ 이식 κ°€λŠ₯ν•˜κ³  미래λ₯Ό λŒ€λΉ„ν•˜λŠ” μ‘μš©μ—μ„œλŠ” κ°€λŠ₯ν•œ 였λ₯˜ λ°˜ν™˜μ„ μ²˜λ¦¬ν•΄μ•Ό ν•  것이닀.)

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
pthread_attr_init(),
pthread_attr_destroy()
μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe

CONFORMING TO

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

NOTES

pthread_attr_t νƒ€μž…μ„ 뢈투λͺ…ν•œ κ²ƒμœΌλ‘œ μ·¨κΈ‰ν•΄μ•Ό ν•œλ‹€. pthreads ν•¨μˆ˜λ₯Ό ν†΅ν•˜μ§€ μ•Šμ€ λ°©μ‹μœΌλ‘œ 객체에 μ ‘κ·Όν•˜λŠ” 것은 이식성이 μ—†μœΌλ©° κ·œμ •λ˜μ§€ μ•Šμ€ κ²°κ³Όλ₯Ό μœ λ°œν•œλ‹€.

EXAMPLE

μ•„λž˜ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” μ„ νƒμ μœΌλ‘œ 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() ν˜ΈμΆœν•  λ•Œ μ’…λ£Œ */
}

SEE ALSO

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

⚠️ **GitHub.com Fallback** ⚠️