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

NAME

pthread_mutexattr_getrobust, pthread_mutexattr_setrobust - ๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด์˜ ๊ฒฌ๊ณ ์„ฑ ์†์„ฑ ์–ป๊ธฐ ๋ฐ ์„ค์ •ํ•˜๊ธฐ

SYNOPSIS

#include <pthread.h>

int pthread_mutexattr_getrobust(const pthread_mutexattr_t *attr,
                                int *robustness);
int pthread_mutexattr_setrobust(pthread_mutexattr_t *attr,
                                int robustness);

-pthread๋กœ ์ปดํŒŒ์ผ ๋ฐ ๋งํฌ.

glibc ๊ธฐ๋Šฅ ํ™•์ธ ๋งคํฌ๋กœ ์š”๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):

pthread_mutexattr_getrobust(), pthread_mutexattr_setrobust():
_POSIX_C_SOURCE >= 200809L

DESCRIPTION

pthread_mutexattr_getrobust() ํ•จ์ˆ˜๋Š” attr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด์˜ ๊ฒฌ๊ณ ์„ฑ ์†์„ฑ ๊ฐ’์„ *robustness์— ๋„ฃ๋Š”๋‹ค. pthread_mutexattr_setrobust() ํ•จ์ˆ˜๋Š” attr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด์˜ ๊ฒฌ๊ณ ์„ฑ ์†์„ฑ ๊ฐ’์„ robustness์— ์ง€์ •ํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

๊ฒฌ๊ณ ์„ฑ ์†์„ฑ์€ ์†Œ์œ ์ž ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ํ’€์ง€ ์•Š๊ณ  ์ฃฝ์—ˆ์„ ๋•Œ ๋ฎคํ…์Šค์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ง€์ •ํ•œ๋‹ค. robustness์— ๋‹ค์Œ ๊ฐ’๋“ค์ด ์œ ํšจํ•˜๋‹ค.

PTHREAD_MUTEX_STALLED
๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด์˜ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค. ๋ฎคํ…์Šค๋ฅผ PTHREAD_MUTEX_STALLED ์†์„ฑ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  ์†Œ์œ ์ž๊ฐ€ ํ’€์ง€ ์•Š๊ณ  ์ฃฝ์œผ๋ฉด ๋ฎคํ…์Šค๊ฐ€ ๊ณ„์† ์ž ๊ธด ์ƒํƒœ๋กœ ์žˆ์œผ๋ฉฐ ํ–ฅํ›„ ๊ทธ ๋ฎคํ…์Šค์— ๋Œ€ํ•œ pthread_mutex_lock(3) ํ˜ธ์ถœ ์‹œ๋„๊ฐ€ ์˜์›ํžˆ ๋ธ”๋ก ํ•˜๊ฒŒ ๋œ๋‹ค.
PTHREAD_MUTEX_ROBUST

๋ฎคํ…์Šค๋ฅผ PTHREAD_MUTEX_ROBUST ์†์„ฑ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  ์†Œ์œ ์ž๊ฐ€ ํ’€์ง€ ์•Š๊ณ  ์ฃฝ์œผ๋ฉด ํ–ฅํ›„ ๊ทธ ๋ฎคํ…์Šค์— ๋Œ€ํ•œ pthread_mutex_lock(3) ํ˜ธ์ถœ ์‹œ๋„๊ฐ€ ์„ฑ๊ณตํ•˜๊ณ  EOWNERDEAD๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ด๋Š” ์›๋ž˜ ์†Œ์œ ์ž๊ฐ€ ๋”๋Š” ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ๋ฎคํ…์Šค๊ฐ€ ๋น„์ผ๊ด€ ์ƒํƒœ์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ EOWNERDEAD ๋ฐ˜ํ™˜ ํ›„์— ๋‹ค์Œ ์†Œ์œ ์ž๊ฐ€ ํš๋“ํ•œ ๋ฎคํ…์Šค์— pthread_mutex_consistent(3)]]๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋” ์ด์šฉํ•˜๊ธฐ ์ „์— ๋ฎคํ…์Šค๋ฅผ ๋‹ค์‹œ ์ •์ƒ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๋‹ค์Œ ์†Œ์œ ์ž๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ์ •์ƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์ „์— pthread_mutex_unlock(3)์œผ๋กœ ํ’€๋ฉด ๋ฎคํ…์Šค๊ฐ€ ์˜๊ตฌํžˆ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ณ  ์ดํ›„ pthread_mutex_lock(3)์œผ๋กœ ์ž ๊ทธ๋ ค๋Š” ์‹œ๋„๊ฐ€ ENOTRECOVERABLE ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ ๋ฎคํ…์Šค์—์„œ ์œ ์ผํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•œ ๋™์ž‘์€ pthread_mutex_destroy(3)์ด๋‹ค.

๋‹ค์Œ ์†Œ์œ ์ž๊ฐ€ pthread_mutex_consistent(3) ํ˜ธ์ถœ ์ „์— ์ข…๋ฃŒํ•˜๋ฉด ๊ทธ ๋ฎคํ…์Šค์— ๋Œ€ํ•œ pthread_mutex_lock(3) ๋™์ž‘์ด ๋‹ค์‹œ EOWNERDEAD๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

pthread_mutexattr_getrobust() ๋ฐ pthread_mutexattr_setrobust()์˜ attr ์ธ์ž๋Š” pthread_mutexattr_init(3)์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ ๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•˜๋ฉฐ, ์•„๋‹ˆ๋ฉด ๋™์ž‘ ๋ฐฉ์‹์ด ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ ์ด ํ•จ์ˆ˜๋“ค์€ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ ์–‘์ˆ˜ ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

glibc ๊ตฌํ˜„์—์„œ pthread_mutexattr_getrobust()๋Š” ํ•ญ์ƒ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ERRORS

EINVAL
pthread_mutexattr_setrobust()์— PTHREAD_MUTEX_STALLED์™€ PTHREAD_MUTEX_ROBUST ์™ธ์˜ ๊ฐ’์„ ์ „๋‹ฌํ–ˆ๋‹ค.

VERSIONS

glibc ๋ฒ„์ „ 2.12์—์„œ pthread_mutexattr_getrobust()์™€ pthread_mutexattr_setrobust()๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

CONFORMING TO

POSIX.1-2008.

NOTES

๋ฆฌ๋ˆ…์Šค ๊ตฌํ˜„์—์„œ ํ”„๋กœ์„ธ์Šค ๊ณต์œ  ๊ฒฌ๊ณ  ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค ์†Œ์œ ์ž๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ํ’€์ง€ ์•Š๊ณ  execve(2)๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋„ ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ EOWNERDEAD ์•Œ๋ฆผ์„ ๋ฐ›๋Š”๋‹ค. POSIX.1์—์„œ๋Š” ์ด ์‚ฌํ•ญ์„ ๋ช…์„ธํ•˜๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ ์ ์–ด๋„ ๋ช‡๋ช‡ ๋‹ค๋ฅธ ๊ตฌํ˜„์—์„œ๋„ ๊ฐ™์€ ๋™์ž‘์ด ์ผ์–ด๋‚œ๋‹ค.

POSIX์— pthread_mutexattr_getrobust() ๋ฐ pthread_mutexattr_setrobust()๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ ์ „์— glibc์—์„œ๋Š” _GNU_SOURCE๊ฐ€ ์ •์˜๋œ ๊ฒฝ์šฐ ๋™๋“ฑํ•œ ๋น„ํ‘œ์ค€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์˜€๋‹ค.

int pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *attr,
                                   int *robustness);
int pthread_mutexattr_setrobust_np(pthread_mutexattr_t *attr,
                                   int robustness);

์ด์— ๋งž๊ฒŒ ์ƒ์ˆ˜ PTHREAD_MUTEX_STALLED_NP์™€ PTHREAD_MUTEX_ROBUST_NP๋„ ์ •์˜ํ•˜์˜€๋‹ค.

์ด GNU ์ „์šฉ API๋Š” glibc 2.4์—์„œ ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋Š” ๊ตฌ์‹์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ƒˆ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์“ฐ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด์˜ ๊ฒฌ๊ณ ์„ฑ ์†์„ฑ ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๋ณด์—ฌ ์ค€๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋ฎคํ…์Šค๋ฅผ ์žก์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ํ’€์ง€ ์•Š๊ณ  ์ผ์ฐ ์ฃฝ๋Š”๋‹ค. ์ดํ›„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํš๋“ํ•˜๊ณ  EOWNERDEAD ์˜ค๋ฅ˜๋ฅผ ์–ป์œผ๋ฉฐ, ๋‹ค์Œ์œผ๋กœ ๋ฎคํ…์Šค๋ฅผ ์ •์ƒ ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.

๋‹ค์Œ ์…ธ ์„ธ์…˜์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋ญ๊ฐ€ ์ฐํžˆ๋Š”์ง€ ๋ณด์—ฌ ์ค€๋‹ค.

$ ./a.out
[original owner] Setting lock...
[original owner] Locked. Now exiting without unlocking.
[main thread] Attempting to lock the robust mutex.
[main thread] pthread_mutex_lock() returned EOWNERDEAD
[main thread] Now make the mutex consistent
[main thread] Mutex is now consistent; unlocking

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>

#define handle_error_en(en, msg) \
               do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

static pthread_mutex_t mtx;

static void *
original_owner_thread(void *ptr)
{
    printf("[original owner] Setting lock...\n");
    pthread_mutex_lock(&mtx);
    printf("[original owner] Locked. Now exiting without unlocking.\n");
    pthread_exit(NULL);
}

int
main(int argc, char *argv[])
{
    pthread_t thr;
    pthread_mutexattr_t attr;
    int s;

    pthread_mutexattr_init(&attr);  /* ์†์„ฑ ๊ฐ์ฒด ์ดˆ๊ธฐํ™” */
    pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST);
                                    /* ๊ฒฌ๊ณ ์„ฑ ์„ค์ • */

    pthread_mutex_init(&mtx, &attr);    /* ๋ฎคํ…์Šค ์ดˆ๊ธฐํ™” */

    pthread_create(&thr, NULL, original_owner_thread, NULL);

    sleep(2);

    /* ์ง€๊ธˆ์ฏค "original_owner_thread"๋Š” ๋๋‚ฌ์„ ๊ฒƒ์ž„ */

    printf("[main thread] Attempting to lock the robust mutex.\n");
    s = pthread_mutex_lock(&mtx);
    if (s == EOWNERDEAD) {
        printf("[main thread] pthread_mutex_lock() returned EOWNERDEAD\n");
        printf("[main thread] Now make the mutex consistent\n");
        s = pthread_mutex_consistent(&mtx);
        if (s != 0)
            handle_error_en(s, "pthread_mutex_consistent");
        printf("[main thread] Mutex is now consistent; unlocking\n");
        s = pthread_mutex_unlock(&mtx);
        if (s != 0)
            handle_error_en(s, "pthread_mutex_unlock");

        exit(EXIT_SUCCESS);
    } else if (s == 0) {
        printf("[main thread] pthread_mutex_lock() unexpectedly succeeded\n");
        exit(EXIT_FAILURE);
    } else {
        printf("[main thread] pthread_mutex_lock() unexpectedly failed\n");
        handle_error_en(s, "pthread_mutex_lock");
    }
}

SEE ALSO

get_robust_list(2), set_robust_list(2), pthread_mutex_init(3), pthread_mutex_consistent(3), pthread_mutex_lock(3), pthreads(7)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ