pthread_mutexattr_setrobust(3) - wariua/manpages-ko GitHub Wiki
pthread_mutexattr_getrobust, pthread_mutexattr_setrobust - ๋ฎคํ ์ค ์์ฑ ๊ฐ์ฒด์ ๊ฒฌ๊ณ ์ฑ ์์ฑ ์ป๊ธฐ ๋ฐ ์ค์ ํ๊ธฐ
#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
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)์ผ๋ก ์ด๊ธฐํ ํ ๋ฎคํ
์ค ์์ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํ๋ฉฐ, ์๋๋ฉด ๋์ ๋ฐฉ์์ด ๊ท์ ๋์ด ์์ง ์๋ค.
์ฑ๊ณต ์ ์ด ํจ์๋ค์ 0์ ๋ฐํํ๋ค. ์ค๋ฅ ์ ์์ ์ค๋ฅ ๋ฒํธ๋ฅผ ๋ฐํํ๋ค.
glibc ๊ตฌํ์์ pthread_mutexattr_getrobust()
๋ ํญ์ 0์ ๋ฐํํ๋ค.
EINVAL
-
pthread_mutexattr_setrobust()
์PTHREAD_MUTEX_STALLED
์PTHREAD_MUTEX_ROBUST
์ธ์ ๊ฐ์ ์ ๋ฌํ๋ค.
glibc ๋ฒ์ 2.12์์ pthread_mutexattr_getrobust()
์ pthread_mutexattr_setrobust()
๊ฐ ์ถ๊ฐ๋์๋ค.
POSIX.1-2008.
๋ฆฌ๋
์ค ๊ตฌํ์์ ํ๋ก์ธ์ค ๊ณต์ ๊ฒฌ๊ณ ๋ฎคํ
์ค๋ฅผ ์ฌ์ฉํ ๋ ๊ฒฌ๊ณ ๋ฎคํ
์ค ์์ ์๊ฐ ๋ฎคํ
์ค๋ฅผ ํ์ง ์๊ณ 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์์ ์ฒ์ ๋ฑ์ฅํ์ผ๋ฉฐ, ํ์ฌ๋ ๊ตฌ์์ด ๋์์ผ๋ฏ๋ก ์ ํ๋ก๊ทธ๋จ์์ ์ฐ์ง ๋ง์์ผ ํ๋ค.
์๋ ํ๋ก๊ทธ๋จ์ ๋ฎคํ
์ค ์์ฑ ๊ฐ์ฒด์ ๊ฒฌ๊ณ ์ฑ ์์ฑ ์ฌ์ฉ ๋ฐฉ์์ ๋ณด์ฌ ์ค๋ค. ์ด ํ๋ก๊ทธ๋จ์์๋ ๋ฎคํ
์ค๋ฅผ ์ก์ ์ค๋ ๋๊ฐ ๋ฎคํ
์ค๋ฅผ ํ์ง ์๊ณ ์ผ์ฐ ์ฃฝ๋๋ค. ์ดํ ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ฎคํ
์ค๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ํ๋ํ๊ณ 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");
}
}
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