pthread_mutex_destroy(3p) - wariua/manpages-ko GitHub Wiki

PROLOG

์ด ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€๋Š” POSIX ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋งค๋‰ด์–ผ์˜ ์ผ๋ถ€์ด๋‹ค. ์ด ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฆฌ๋ˆ…์Šค ๊ตฌํ˜„์— ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ (์ƒ์„ธํ•œ ๋ฆฌ๋ˆ…์Šค ๋™์ž‘ ๋ฐฉ์‹์€ ํ•ด๋‹น ๋ฆฌ๋ˆ…์Šค ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€ ์ฐธ๊ณ ) ๋ฆฌ๋ˆ…์Šค์—์„œ ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

NAME

pthread_mutex_destroy, pthread_mutex_init - ๋ฎคํ…์Šค ํŒŒ๊ธฐ ๋ฐ ์ดˆ๊ธฐํ™”

SYNOPSIS

#include <pthread.h>

int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
    const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

DESCRIPTION

pthread_mutex_destroy() ํ•จ์ˆ˜๋Š” mutex๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฎคํ…์Šค ๊ฐ์ฒด๋ฅผ ํŒŒ๊ธฐํ•œ๋‹ค. ๊ทธ ๋ฎคํ…์Šค ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ์•ˆ ๋œ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค. ๊ตฌํ˜„ ์‹œ pthread_mutex_destroy()์—์„œ mutex๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋ฅผ ๋น„์œ ํšจ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํŒŒ๊ธฐ๋œ ๋ฎคํ…์Šค ๊ฐ์ฒด๋ฅผ pthread_mutex_init()์œผ๋กœ ๋‹ค์‹œ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ๊ธฐ๋œ ๊ฐ์ฒด๋ฅผ ๊ทธ ์™ธ ๋ฐฉ์‹์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒฐ๊ณผ๋Š” ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

์ž ๊ฒจ ์žˆ์ง€ ์•Š์€ ์ดˆ๊ธฐํ™” ๋œ ๋ฎคํ…์Šค๋ฅผ ํŒŒ๊ธฐํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜๋‹ค. ์ž ๊ฒจ ์žˆ๋Š” ๋ฎคํ…์Šค๋‚˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ฐธ์กฐํ•˜๋Š” (๊ฐ€๋ น pthread_cond_timedwait()์ด๋‚˜ pthread_cond_wait()์— ์“ฐ์ด๊ณ  ์žˆ๋Š”) ๋ฎคํ…์Šค๋ฅผ ํŒŒ๊ธฐํ•˜๋ ค๋Š” ์‹œ๋„์˜ ๊ฒฐ๊ณผ๋Š” ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

pthread_mutex_init() ํ•จ์ˆ˜๋Š” mutex๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฎคํ…์Šค๋ฅผ attr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์†์„ฑ๋“ค๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. attr์ด NULL์ด๋ฉด ๊ธฐ๋ณธ ๋ฎคํ…์Šค ์†์„ฑ๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰ ๊ธฐ๋ณธ ๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๊ณผ ํšจ๊ณผ๊ฐ€ ๊ฐ™๋‹ค. ์ดˆ๊ธฐํ™” ์„ฑ๊ณต ์‹œ ๋ฎคํ…์Šค๋Š” ์ดˆ๊ธฐํ™” ๋˜๊ณ  ํ’€๋ ค ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

mutex ์ž์ฒด๋งŒ ๋™๊ธฐํ™” ์ˆ˜ํ–‰์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. mutex์˜ ์‚ฌ๋ณธ์„ pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock(), pthread_mutex_destroy() ํ˜ธ์ถœ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๊ฒฐ๊ณผ๋Š” ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

์ด๋ฏธ ์ดˆ๊ธฐํ™” ๋œ ๋ฎคํ…์Šค๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋ ค๋Š” ์‹œ๋„์˜ ๊ฒฐ๊ณผ๋Š” ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

๊ธฐ๋ณธ ๋ฎคํ…์Šค ์†์„ฑ๋“ค์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ์—๋Š” ๋งคํฌ๋กœ PTHREAD_MUTEX_INITIALIZER๋ฅผ ์จ์„œ ๋ฎคํ…์Šค๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ attr์„ NULL๋กœ ์ง€์ •ํ•ด pthread_mutex_init()์„ ํ˜ธ์ถœํ•˜๋Š” ๋™์  ์ดˆ๊ธฐํ™”์™€ ํšจ๊ณผ๊ฐ€ ๋™๋“ฑํ•˜๋˜ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

pthread_mutex_destroy()์˜ mutex ์ธ์ž๋กœ ์ง€์ •ํ•œ ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋œ ๋ฎคํ…์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

pthread_mutex_init()์˜ attr ์ธ์ž๋กœ ์ง€์ •ํ•œ ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋œ ๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ pthread_mutex_destroy()์™€ pthread_mutex_init() ํ•จ์ˆ˜๋Š” 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ERRORS

๋‹ค์Œ ๊ฒฝ์šฐ์— pthread_mutex_init() ํ•จ์ˆ˜๊ฐ€ ์‹คํŒจํ•œ๋‹ค.

EAGAIN
๋ฎคํ…์Šค๋ฅผ ์ƒˆ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ (๋ฉ”๋ชจ๋ฆฌ ์™ธ์˜) ์ž์›์ด ์‹œ์Šคํ…œ์— ๋ถ€์กฑํ•˜๋‹ค.
ENOMEM
๋ฎคํ…์Šค๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๋‹ค.
EPERM
ํ˜ธ์ถœ์ž์—๊ฒŒ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํŠน๊ถŒ์ด ์—†๋‹ค.

๋‹ค์Œ ๊ฒฝ์šฐ์— pthread_mutex_init() ํ•จ์ˆ˜๊ฐ€ ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

EINVAL
attr์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์†์„ฑ ๊ฐ์ฒด์— ๊ฒฌ๊ณ  ๋ฎคํ…์Šค ์†์„ฑ์ด ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด์„œ ํ”„๋กœ์„ธ์Šค ๊ณต์œ  ์†์„ฑ์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.

์ด ํ•จ์ˆ˜๋“ค์€ ์˜ค๋ฅ˜ ์ฝ”๋“œ [EINTR]์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ดํ•˜๋Š” ๊ทœ๋ฒ”์ ์ด์ง€ ์•Š์€ ๋‚ด์šฉ์ด๋‹ค.

EXAMPLES

์—†์Œ.

APPLICATION USAGE

์—†์Œ.

RATIONALE

pthread_mutex_destroy()์˜ mutex ์ธ์ž๋กœ ์ง€์ •ํ•œ ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋œ ๋ฎคํ…์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š์Œ์„ ๊ตฌํ˜„์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•˜๊ณ  [EINVAL] ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

pthread_mutex_destroy()๋‚˜ pthread_mutex_init()์˜ mutex ์ธ์ž๋กœ ์ง€์ •ํ•œ ๊ฐ’์ด ์ž ๊ฒจ ์žˆ๋Š” ๋ฎคํ…์Šค๋‚˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ฐธ์กฐํ•˜๋Š” (๊ฐ€๋ น pthread_cond_timedwait()์ด๋‚˜ pthread_cond_wait()์— ์‚ฌ์šฉ ์ค‘์ธ) ๋ฎคํ…์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Œ์„, ๋˜๋Š” pthread_mutex_init()์˜ mutex ์ธ์ž๋กœ ์ง€์ •ํ•œ ๊ฐ’์ด ์ด๋ฏธ ์ดˆ๊ธฐํ™” ๋œ ๋ฎคํ…์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Œ์„ ๊ตฌํ˜„์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•˜๊ณ  [EBUSY] ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

pthread_mutex_init()์˜ attr ์ธ์ž๋กœ ์ง€์ •ํ•œ ๊ฐ’์ด ์ดˆ๊ธฐํ™” ๋œ ๋ฎคํ…์Šค ์†์„ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์ง€ ์•Š์Œ์„ ๊ตฌํ˜„์—์„œ ๊ฐ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ์‹คํŒจ ์ฒ˜๋ฆฌํ•˜๊ณ  [EINVAL] ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„

POSIX.1-2008์˜ ์ด ๊ถŒ์—์„  ์—ฌ๋Ÿฌ ๋Œ€์•ˆ์ ์ธ ๋ฎคํ…์Šค ๊ตฌํ˜„๋“ค์„ ์ง€์›ํ•œ๋‹ค. ๊ตฌํ˜„์—์„œ ๋ฝ์„ pthread_mutex_t ํƒ€์ž… ๊ฐ์ฒด์— ๋ฐ”๋กœ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์•„๋‹ˆ๋ฉด ๋ฝ์„ ํž™์— ์ €์žฅํ•˜๊ณ  ๋ฎคํ…์Šค ๊ฐ์ฒด์—๋Š” ํฌ์ธํ„ฐ๋‚˜ ํ•ธ๋“ค, ๊ณ ์œ  ID๋งŒ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์–ด๋А ํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹์— ์žฅ์ ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๊ณ  ํŠน์ • ํ•˜๋“œ์›จ์–ด ๊ตฌ์„ฑ์—์„œ ์–ด๋А ํ•œ์ชฝ๋งŒ ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ์„ ํƒ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ์ด์‹์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด POSIX.1-2008์˜ ์ด ๊ถŒ์—์„œ๋Š” ์ด ํƒ€์ž…์— ํ• ๋‹น ๋‚ด์ง€ ๋™์ผ ์—ฐ์‚ฐ์„ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ, "์ดˆ๊ธฐํ™”"๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฝ์ด ์‹ค์ œ ๋ฎคํ…์Šค ๊ฐ์ฒด ๋‚ด์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” (๋” ์ œํ•œ์ ์ธ) ๊ฐœ๋…์„ ๊ฐ•์กฐํ•œ๋‹ค.

์ด๋Š” ๋ฎคํ…์Šค ๋‚ด์ง€ ์กฐ๊ฑด ๋ณ€์ˆ˜ ํƒ€์ž…์˜ ๊ณผ์ž‰ ๋ช…์„ธ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ ํƒ€์ž… ๋ถˆํˆฌ๋ช…์„ฑ์˜ ๋™๊ธฐ๊ฐ€ ๋œ๋‹ค.

pthread_mutex_destroy()์—์„œ ๋ฎคํ…์Šค์— ๋ถ€์ ๋ฒ•ํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋˜ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฏธ ํŒŒ๊ธฐ๋œ ๋ฎคํ…์Šค๋ฅผ ์ž ๊ทธ๋ ค๊ณ  (๋˜๋Š” ๋‹ฌ๋ฆฌ ์ฐธ์กฐํ•˜๋ ค๊ณ ) ํ•˜๋Š” ์˜ค๋ฅ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์˜ค๋ฅ˜ ๊ฒ€์‚ฌ์™€ ์ง€์› ์„ฑ๋Šฅ ๊ฐ„์˜ ํƒ€ํ˜‘

๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ์˜ค๋ฅ˜ ์กฐ๊ฑด๋“ค์ด ๊ตฌํ˜„์—์„œ์˜ ๊ฐ์ง€๊ฐ€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ๋ฐ, ๊ตฌํ˜„์—์„œ ๊ตฌ์ฒด์ ์ธ ์‘์šฉ ๋ฐ ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ํ•„์š”์— ๋”ฐ๋ผ ์„ฑ๋Šฅ๊ณผ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ ์ˆ˜์ค€ ๊ฐ„์— ํƒ€ํ˜‘์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‹œ์Šคํ…œ์— ์˜ํ•œ (๋ฉ”๋ชจ๋ฆฌ ๋ถˆ์ถฉ๋ถ„ ๊ฐ™์€) ์กฐ๊ฑด๋“ค์€ ๊ฐ์ง€๊ฐ€ ํ•„์ˆ˜์ด์ง€๋งŒ ์ž˜๋ชป ์ฝ”๋”ฉ ๋œ ์‘์šฉ์— ์˜ํ•œ (์‚ฌ์šฉ ์ค‘์ธ ๋ฎคํ…์Šค๊ฐ€ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•œ ์ ์ ˆํ•œ ๋™๊ธฐํ™”์— ์‹คํŒจํ•˜๋Š” ๊ฒƒ ๊ฐ™์€) ์กฐ๊ฑด๋“ค์€ ๊ฒฐ๊ณผ๊ฐ€ ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ช…์„ธํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ๋„“์€ ๋ฒ”์œ„์˜ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‘์šฉ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๊ตฌํ˜„์—์„œ๋Š” ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๊ณ , ์ฆ๋ช… ๊ฐ€๋Šฅํ•˜๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์‘์šฉ ํ•˜๋‚˜๋ฅผ ์ž„๋ฒ ๋””๋“œ ์ปดํ“จํ„ฐ์˜ ์•„์ฃผ ์—„๊ฒฉํ•œ ์„ฑ๋Šฅ ์ œ์•ฝ ํ•˜์—์„œ ๋Œ๋ฆฌ๋Š” ๊ตฌํ˜„์—์„œ๋Š” ์ตœ์†Œํ•œ์˜ ๊ฒ€์‚ฌ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์˜ต์…˜๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „(์ „์ฒด ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๋А๋ฆฐ ๋ฒ„์ „๊ณผ ์ œํ•œ๋œ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๋น ๋ฅธ ๋ฒ„์ „)์œผ๋กœ ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ์„ ํƒ์„ ๋ง‰๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

"๋™์ž‘์ด ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š์Œ"์„ ์ž˜๋ชป๋œ (์ž˜๋ชป ์ฝ”๋”ฉ ๋œ) ์‘์šฉ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘๋“ค์—๋งŒ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ ์šฉํ•˜๊ณ  ์ž์› ์‚ฌ์šฉ ๋ถˆ๊ฐ€ ์˜ค๋ฅ˜๋“ค์€ ํ•„์ˆ˜๋กœ ์ •์˜ํ•จ์œผ๋กœ์จ POSIX.1-2008์˜ ์ด ๊ถŒ์€ ์˜ฌ๋ฐ”๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๋ฉด ์ ˆ๋Œ€ ํ•˜์ง€ ์•Š์„ ๋งŽ์€ ๊ฒƒ๋“ค์„ ๊ฒ€์‚ฌํ•˜๋Š” ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ชจ๋“  ๊ตฌํ˜„์— ๊ฐ•์ œํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์™„์ „ํ•œ ์ค€์ˆ˜ ์‘์šฉ์ด ๋ชจ๋“  ๊ตฌํ˜„๋“ค์— ๊ฑธ์ณ ์ด์‹ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค. ๋™์ž‘์ด ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ๋Š” ๊ทธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ตฌํ˜„์—์„œ ์–ด๋–ค ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ์˜ ๋ฐ˜ํ™˜๋„ ๋ช…์„ธํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋™์ž‘์ด ๊ทœ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์Šจ ์ผ์ด๋“  ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์ž„์˜ ๊ฐ’(์œ ํšจํ•˜๋˜ ์ƒ์ดํ•  ์ˆ˜๋„ ์žˆ๋Š” ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๋„ ํฌํ•จ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์‘์šฉ ๊ฐœ๋ฐœ ์ค‘ ๋ฌธ์ œ๋ฅผ ์ง„๋‹จํ•  ๋•Œ ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ๊ฐ€ ์‘์šฉ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ๊ตฌํ˜„์—์„œ ์˜ค๋ฅ˜ ์กฐ๊ฑด์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ํŠน์ • ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๋Š” ๊ถŒ๊ณ ๋ฅผ ์ด ์ ˆ์—์„œ ํ•œ๋‹ค.

์ œํ•œ์„ ์ •์˜ํ•˜์ง€ ์•Š์€ ์ด์œ 

๋ฎคํ…์Šค ๋ฐ ์กฐ๊ฑด ๋ณ€์ˆ˜์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜์— ๋Œ€ํ•œ ์‹ฌ๋ณผ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์˜€์œผ๋‚˜ ์ด ๊ฐ์ฒด๋“ค์˜ ์ˆ˜๊ฐ€ ๋™์ ์œผ๋กœ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๋ถ€ํ•˜์˜€๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋งŽ์€ ๊ตฌํ˜„์—์„œ๋Š” ์ด ๊ฐ์ฒด๋“ค์„ ์‘์šฉ ๋ฉ”๋ชจ๋ฆฌ์— ๋‘๊ณ , ๊ทธ๋ž˜์„œ ๋ช…์‹œ์  ์ตœ๋Œ“๊ฐ’์ด ์—†๋‹ค.

๋ฎคํ…์Šค์™€ ์กฐ๊ฑด ๋ณ€์ˆ˜์˜ ์ •์  ์ดˆ๊ธฐํ™”

์ •์  ํ• ๋‹น ๋™๊ธฐํ™” ๊ฐ์ฒด๋ฅผ ์ •์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋‚ด๋ถ€์— ์ •์  ๋™๊ธฐํ™” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“ˆ์—์„œ ๋Ÿฐํƒ€์ž„ ์ดˆ๊ธฐํ™” ๊ฒ€์‚ฌ์™€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์ž๊ฐ€ ์ดˆ๊ธฐํ™” ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•ด์ง„๋‹ค. C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์— ๊ทธ๋Ÿฐ ๋ชจ๋“ˆ์ด ํ”ํ•œ๋ฐ, ์—ฌ๋Ÿฌ ์ด์œ  ๋•Œ๋ฌธ์— ์„ค๊ณ„ ๊ณผ์ •์—์„œ ๋ช…์‹œ์ ์ธ ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์š”๊ตฌํ•˜๋Š” ๋Œ€์‹  ์ž๊ฐ€ ์ดˆ๊ธฐํ™”๋ฅผ ํƒํ•œ๋‹ค. ์ •์  ์ดˆ๊ธฐํ™” ์‚ฌ์šฉ ์˜ˆ์‹œ๊ฐ€ ์•„๋ž˜์— ์žˆ๋‹ค.

์ •์  ์ดˆ๊ธฐํ™” ์—†์ด๋Š” ์ž๊ฐ€ ์ดˆ๊ธฐํ™” ๋ฃจํ‹ด foo()๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์ผ ๊ฒƒ์ด๋‹ค.

static pthread_once_t foo_once = PTHREAD_ONCE_INIT;
static pthread_mutex_t foo_mutex;

void foo_init()
{
    pthread_mutex_init(&foo_mutex, NULL);
}

void foo()
{
    pthread_once(&foo_once, foo_init);
    pthread_mutex_lock(&foo_mutex);
    /* ์ž‘์—… ์ˆ˜ํ–‰ */
    pthread_mutex_unlock(&foo_mutex);
}

์ •์  ์ดˆ๊ธฐํ™”๋ฅผ ์“ฐ๋ฉด ๊ฐ™์€ ๋ฃจํ‹ด์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

static pthread_mutex_t foo_mutex = PTHREAD_MUTEX_INITIALIZER;

void foo()
{
    pthread_mutex_lock(&foo_mutex);
    /* ์ž‘์—… ์ˆ˜ํ–‰ */
    pthread_mutex_unlock(&foo_mutex);
}

์ •์  ์ดˆ๊ธฐํ™”๋Š” pthread_once() ๋‚ด์˜ ์ดˆ๊ธฐํ™” ๊ฒ€์‚ฌ์™€ pthread_mutex_lock() ๋‚ด์ง€ pthread_mutex_unlock()์— ์ „๋‹ฌํ•  ์ฃผ์†Œ๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•œ &foo_mutex ํŽ˜์น˜์˜ ํ•„์š”์„ฑ์„ ๋ชจ๋‘ ์—†์•  ์ค€๋‹ค.

๋”ฐ๋ผ์„œ ์ •์  ๊ฐ์ฒด ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์ž‘์„ฑํ•˜๋Š” C ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ์‹œ์Šคํ…œ์—์„œ ๋‹จ์ˆœํ•ด์ง€๋ฉฐ, ๋™๊ธฐํ™” ๊ฐ์ฒด(์ „์ฒด)๋ฅผ ์‘์šฉ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์—์„œ ๋นจ๋ผ์ง„๋‹ค.

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

pthread_mutex_lock()์˜ ์ด๋Ÿฐ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ์ผ๊ฒฌ ๊ฐ€์š‹์ผ์ฒ˜๋Ÿผ ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜์—ˆ๋Š”์ง€ ์•Œ์•„๋ณด๋ ค๋ฉด ์ถ”๊ฐ€ ๊ฒ€์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„ ๋จธ์‹ ์—์„œ๋Š” ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , 0์ธ์ง€ ๊ฒ€์‚ฌํ•˜๊ณ , ์ด๋ฏธ ์ดˆ๊ธฐํ™” ๋˜์—ˆ์œผ๋ฉด ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹์œผ๋กœ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ ๊ฒ€์‚ฌ๊ฐ€ ๊ฐ€์š‹์ผ์„ ๋”ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ผ ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ๋“œ๋Š” ์ถ”๊ฐ€ ๋…ธ๋ ฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด์‹œํ•  ๋งŒํ•˜๋‹ค. ์‹ค์ œ ์ถ”๊ฐ€๋กœ ์ด๋ค„์ง€๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๊ฐ€ ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ ์  ๋งŽ์€ ๋จธ์‹ ๋“ค์—์„œ ์บ์‹œ๋ฅผ ์ œ๊ณตํ•˜๋ฉด์„œ ์ง„์งœ ๋น„์‹ผ ๊ฒƒ์€ ์‹คํ–‰ ์ธ์ŠคํŠธ๋Ÿญ์…˜์ด ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ์ด๋‹ค.

๋˜๋Š” ๋จธ์‹  ์•„ํ‚คํ…์ฒ˜์— ๋”ฐ๋ผ์„  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์ธ ์ดˆ๊ธฐํ™” ํ›„ ์ด๋ค„์ง€๋Š” ๋ฝ ์ž‘์—…์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์™„์ „ํžˆ ์—†์• ๋Š” ๊ฒƒ์ด ์ข…์ข… ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋” ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋œ ๋นˆ๋ฒˆํ•œ ์ž‘์—…์ธ ์ดˆ๊ธฐํ™”๋กœ ์˜ฎ๊ธด๋‹ค. ์™ธ๋ถ€ ๋ฎคํ…์Šค ํ• ๋‹น์€ ์‹ค์ œ ๋ฝ์„ ์•Œ์•„๋‚ด๊ธฐ ์œ„ํ•ด ์ฃผ์†Œ๋ฅผ ์—ญ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•˜๋ฉฐ, ๊ทธ๋ž˜์„œ ๋„๋ฆฌ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ• ํ•˜๋‚˜๋Š” ์ •์  ์ดˆ๊ธฐํ™” ๋•Œ ๊ทธ ์ฃผ์†Œ๋กœ ๊ฐ€์งœ ๊ฐ’์„, ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๋จธ์‹  ํดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ ๋ฎคํ…์Šค๋ฅผ ์ž ๊ทธ๋ ค๋Š” ์ฒซ ์‹œ๋„์—์„œ ๊ทธ๋Ÿฐ ํดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•œ ๋‹ค์Œ ์‹ค์ œ ๋ฝ์˜ ์˜ฌ๋ฐ”๋ฅธ ์ฃผ์†Œ๋ฅผ ์ฑ„์šธ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ดํ›„ ๋ฝ ์ž‘์—…์—์„œ "ํดํŠธ" ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์–ด๋–ค ์ถ”๊ฐ€ ์˜ค๋ฒ„ํ—ค๋“œ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ๋ฝ ํš๋“ ์„ฑ๋Šฅ์— ๋ถ€์ •์  ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ์ •์  ์ดˆ๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์“ธ ์ˆ˜ ์žˆ๋Š” ํ•œ ๊ธฐ๋ฒ•์ผ ๋ฟ์ด๋‹ค. ๋จธ์‹ ์— ๋งค์šฐ ์˜์กด์ ์ธ ๋‹ค๋ฅธ ๊ธฐ๋ฒ•๋“ค๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ๋ฎคํ…์Šค ํ• ๋‹น์„ ํ•˜๋Š” ๋จธ์‹ ์—์„œ๋Š” ๋ฌต์‹œ์  ์ดˆ๊ธฐํ™” ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๋ฝํ‚น ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋น„์Šทํ•˜๊ณ  ๋ฎคํ…์Šค ํ• ๋‹น์„ ์™„์ „ํžˆ ์ž์ฒด์— ํ•˜๋Š” ๋จธ์‹ ์—์„œ๋Š” ํ–ฅ์ƒ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ž์ฒด ๊ฒฝ์šฐ๋Š” ํ›จ์”ฌ ๋นจ๋ผ์ง€๊ณ  ์™ธ๋ถ€ ๊ฒฝ์šฐ๋Š” ํฌ๊ฒŒ ๋‚˜์˜์ง€ ์•Š๋‹ค.

๊ทธ๋Ÿฐ ๋จธ์‹ ๋“ค์—์„œ ๋ฝํ‚น ์„ฑ๋Šฅ ๋ฌธ์ œ ์™ธ์— ์ œ๊ธฐ๋˜๋Š” ์šฐ๋ ค๊ฐ€ ์žˆ๋Š”๋ฐ, ์Šค๋ ˆ๋“œ๋“ค์ด ์ •์  ํ• ๋‹น ๋ฎคํ…์Šค ์ดˆ๊ธฐํ™”๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๋ ค ํ•  ๋•Œ ์ดˆ๊ธฐํ™” ๋ฝ์„ ๋‘๊ณ  ๊ฒฝ์Ÿํ•˜๋ฉด์„œ ์ง๋ ฌํ™” ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. (๊ทธ ๋งˆ๋ฌด๋ฆฌ๋Š” ๋ณดํ†ต ๋‚ด๋ถ€ ๋ฝ์„ ์žก๊ณ , ์–ด๋–ค ๊ตฌ์กฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๊ทธ ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฎคํ…์Šค์— ์ €์žฅํ•˜๊ณ , ๋‚ด๋ถ€ ๋ฝ์„ ๋†“๋Š” ์‹์œผ๋กœ ์ด๋ค„์ง„๋‹ค.) ์ผ๋‹จ ๋งŽ์€ ๊ตฌํ˜„์—์„œ๋Š” ๋ฎคํ…์Šค ์ฃผ์†Œ๋กœ ํ•ด์‹ฑ์„ ํ•ด์„œ ๊ทธ๋Ÿฐ ์ง๋ ฌํ™”๋ฅผ ์ค„์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ์ง๋ ฌํ™”๋Š” ์ œํ•œ๋œ ํšŸ์ˆ˜๋กœ๋งŒ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ •ํ™•ํžˆ๋Š” ์ตœ๋Œ€๋กœ๋„ ์ •์  ํ• ๋‹น ๋™๊ธฐํ™” ๊ฐ์ฒด ์ˆ˜๋งŒํผ๋งŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™์  ํ• ๋‹น ๊ฐ์ฒด๋Š” ์—ฌ์ „ํžˆ pthread_mutex_init()์ด๋‚˜ pthread_cond_init()์„ ํ†ตํ•ด ์ดˆ๊ธฐํ™” ๋  ๊ฒƒ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์–ด๋–ค ๊ตฌํ˜„ ์ƒ์—์„œ ์™ธ๋ถ€ ํ• ๋‹น์„ ์œ„ํ•œ ์œ„์˜ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์–ด๋А ๊ฒƒ๋„ ์‘์šฉ์—๊ฒŒ ์ถฉ๋ถ„ํ•œ ์„ฑ๋Šฅ์„ ๋‚ด์ง€ ๋ชปํ•œ๋‹ค๋ฉด ์‘์šฉ์—์„œ ๋™๊ธฐํ™” ๊ฐ์ฒด ๋ชจ๋‘๋ฅผ ์–ด๋А ๊ตฌํ˜„์—์„œ๋„ ์ง€์›ํ•˜๋Š” pthread_*_init() ํ•จ์ˆ˜๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•ด์„œ ์ •์  ์ดˆ๊ธฐํ™”๋ฅผ ์•„์˜ˆ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๊ตฌํ˜„์—์„œ๋Š” ๊ฐ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์„ ๋ฌธ์„œํ™” ํ•˜๊ณ  ๊ทธ ํŠน์ • ๊ตฌํ˜„์—์„œ ์–ด๋А ์ดˆ๊ธฐํ™” ๊ธฐ๋ฒ•์ด ๋” ํšจ์œจ์ ์ธ์ง€ ์กฐ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฎคํ…์Šค ํŒŒ๊ธฐ

์ž ๊ธˆ์„ ํ‘ผ ์งํ›„์— ๋ฎคํ…์Šค๋ฅผ ํŒŒ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

struct obj {
    pthread_mutex_t om;
    int refcnt;
};

obj_done(struct obj *op)
{
    pthread_mutex_lock(&op->om);
    if (--op->refcnt == 0) {
        pthread_mutex_unlock(&op->om);
(A)     pthread_mutex_destroy(&op->om);
(B)     free(op);
    } else
(C)     pthread_mutex_unlock(&op->om);
}

์—ฌ๊ธฐ์„œ obj์—๋Š” ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ์žˆ๊ณ  ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๋‚ด๋ ค๊ฐˆ ๋•Œ๋งˆ๋‹ค obj_done()์ด ํ˜ธ์ถœ๋œ๋‹ค. ๊ตฌํ˜„์—์„œ๋Š” ๊ฐ์ฒด ์ž ๊ธˆ์„ ํ‘ผ (C ํ–‰) ์งํ›„์— ๊ฐ์ฒด๋ฅผ ํŒŒ๊ธฐ ๋ฐ ํ•ด์ œํ•˜๊ณ  ์–ด์ฉŒ๋ฉด ๋งต ํ•ด์ œ๊นŒ์ง€ ํ•  ์ˆ˜ (๊ฐ€๋ น A ๋ฐ B ํ–‰) ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

๊ฒฌ๊ณ  ๋ฎคํ…์Šค

๊ตฌํ˜„์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค ๊ณต์œ  ์†์„ฑ์ด PTHREAD_PROCESS_SHARED๋กœ ์„ค์ •๋œ ๋ฎคํ…์Šค์— ๋Œ€ํ•ด ๊ฒฌ๊ณ  ๋ฎคํ…์Šค๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ๊ตฌํ˜„์—์„œ ํ”„๋กœ์„ธ์Šค ๊ณต์œ  ์†์„ฑ์ด PTHREAD_PROCESS_PRIVATE์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์„ ๋•Œ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋˜ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ๋‹ค.

FUTURE DIRECTIONS

์—†์Œ.

SEE ALSO

pthread_mutex_getprioceiling(), pthread_mutex_getrobust(), pthread_mutex_lock(), pthread_mutex_timedlock(), pthread_mutexattr_getpshared()

POSIX.1-2008 Base Definitions ๊ถŒ, <pthread.h>

COPYRIGHT

Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1, 2013 Edition, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 7, Copyright (C) 2013 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. (This is POSIX.1-2008 with the 2013 Technical Corrigendum 1 applied.) In the event of any discrepancy between this version and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.unix.org/online.html .

Any typographical or formatting errors that appear in this page are most likely to have been introduced during the conversion of the source files to man page format. To report such errors, see https://www.kernel.org/doc/man-pages/reporting_bugs.html .


2013

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