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

PROLOG

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

NAME

pthread_cond_timedwait, pthread_cond_wait - ์กฐ๊ฑด ๊ธฐ๋‹ค๋ฆฌ๊ธฐ

SYNOPSIS

#include <pthread.h>

int pthread_cond_timedwait(pthread_cond_t *restrict cond,
    pthread_mutex_t *restrict mutex,
    const struct timespec *restrict abstime);
int pthread_cond_wait(pthread_cond_t *restrict cond,
    pthread_mutex_t *restrict mutex);

DESCRIPTION

pthread_cond_timedwait() ๋ฐ pthread_cond_wait() ํ•จ์ˆ˜๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋ธ”๋ก ํ•œ๋‹ค. ์‘์šฉ์—์„œ๋Š” ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ mutex๋ฅผ ์ž ๊ทผ ์ƒํƒœ๋กœ ์ด ํ•จ์ˆ˜๋“ค์„ ํ˜ธ์ถœํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์•ˆ ๊ทธ๋Ÿฌ๋ฉด (PTHREAD_MUTEX_ERRORCHECK ๋ฐ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค์—์„œ) ์˜ค๋ฅ˜๋‚˜ (๋‹ค๋ฅธ ๋ฎคํ…์Šค์—์„œ) ๊ทœ์ • ์•ˆ ๋œ ๋™์ž‘์ด ์ผ์–ด๋‚œ๋‹ค.

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

์„ฑ๊ณต ๋ฐ˜ํ™˜ ์‹œ ๋ฎคํ…์Šค๊ฐ€ ์ž ๊ฒจ ์žˆ์œผ๋ฉฐ ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ทธ ๋ฎคํ…์Šค๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค. mutex๊ฐ€ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค์ธ๋ฐ ์†Œ์œ ์ž๊ฐ€ ๋ฝ์„ ์žก์€ ์ฑ„ ์ข…๋ฃŒํ–ˆ๊ณ  ๊ทธ ์ƒํƒœ๊ฐ€ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•˜๋ฉด ํ•จ์ˆ˜๋Š” ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋”๋ผ๋„ ๋ฎคํ…์Šค๋ฅผ ํš๋“ํ•˜๊ฒŒ ๋œ๋‹ค.

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

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

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

pthread_cond_timedwait() ๋‚ด์ง€ pthread_cond_wait() ํ˜ธ์ถœ ๋‚ด์—์„œ ๋ธ”๋ก ๋˜์–ด ์žˆ๋Š” ์ค‘์— ์ทจ์†Œ๋˜์–ด ๋ธ”๋ก์ด ํ•ด์ œ๋œ ์Šค๋ ˆ๋“œ๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋ธ”๋ก ๋œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋™์‹œ์— ๊ทธ ์กฐ๊ฑด ๋ณ€์ˆ˜๋กœ ํ–ฅํ•ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด ์‹ ํ˜ธ๋ฅผ ์†Œ๋ชจํ•˜์ง€ ์•Š๋Š”๋‹ค.

pthread_cond_timedwait() ํ•จ์ˆ˜๋Š” pthread_cond_wait()๊ณผ ๋™๋“ฑํ•˜๋‹ค. ๋‹จ, ์กฐ๊ฑด cond์— ๋Œ€ํ•œ ์‹ ํ˜ธ๋‚˜ ๋™๋ณด๊ฐ€ ์žˆ๊ธฐ ์ „์— abstime์œผ๋กœ ์ง€์ •ํ•œ ์ ˆ๋Œ€ ์‹œ๊ฐ„์ด ์ง€๋‚  ๋•Œ(์ฆ‰ ์‹œ์Šคํ…œ ์‹œ๊ฐ„์ด abstime๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๊ทธ๋ณด๋‹ค ์ปค์งˆ ๋•Œ), ๋˜๋Š” abstime์œผ๋กœ ์ง€์ •ํ•œ ์ ˆ๋Œ€ ์‹œ๊ฐ„์ด ํ˜ธ์ถœ ์‹œ์ ์— ์ด๋ฏธ ์ง€๋‚˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ํƒ€์ž„์•„์›ƒ์ด ์ผ์–ด๋‚  ๋•Œ์—๋„ pthread_cond_timedwait()์€ mutex๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฎคํ…์Šค๋ฅผ ๋†“์•˜๋‹ค๊ฐ€ ์žฌํš๋“ํ•˜๋ฉฐ, ๋™์‹œ์— ๊ทธ ์กฐ๊ฑด ๋ณ€์ˆ˜๋กœ ํ–ฅํ•ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด ์‹ ํ˜ธ๋ฅผ ์†Œ๋ชจํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์กฐ๊ฑด ๋ณ€์ˆ˜์—๋Š” ํด๋Ÿญ ์†์„ฑ์ด ์žˆ์œผ๋ฉฐ abstime ์ธ์ž๋กœ ์ง€์ •ํ•˜๋Š” ์‹œ๊ฐ„ ์ธก์ •์— ์‚ฌ์šฉํ•  ํด๋Ÿญ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. pthread_cond_timedwait() ํ•จ์ˆ˜๋„ ์ทจ์†Œ์ ์ด๋‹ค.

์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์‹œ๊ทธ๋„์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ค‘๋‹จ๋œ ์  ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค์‹œ ์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋Œ€๊ธฐํ•˜๊ฑฐ๋‚˜, ๋ถˆ์š” wakeup ๋•Œ๋ฌธ์— 0์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

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

RETURN VALUE

[ETIMEDOUT] ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ด ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋“ค์€ ๋ชจ๋‘ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ ์‹œ์ž‘ ์งํ›„์— ์ˆ˜ํ–‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฉฐ ํšจ๊ณผ์ƒ mutex๋กœ ์ง€์ •ํ•œ ๋ฎคํ…์Šค๋‚˜ cond๋กœ ์ง€์ •ํ•œ ์กฐ๊ฑด ๋ณ€์ˆ˜์˜ ์ƒํƒœ ๋ณ€๊ฒฝ ์ „์— ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ์œ ๋ฐœํ•œ๋‹ค.

์„ฑ๊ณต ์™„๋ฃŒ์‹œ 0 ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ERRORS

๋‹ค์Œ ๊ฒฝ์šฐ์— ์ด ํ•จ์ˆ˜๋“ค์ด ์‹คํŒจํ•œ๋‹ค.

ENOTRECOVERABLE
๋ฎคํ…์Šค๊ฐ€ ๋ณดํ˜ธํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋ณต๊ตฌ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค.
EOWNERDEAD
๋ฎคํ…์Šค๊ฐ€ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค์ด๋ฉฐ ์ด์ „ ์†Œ์œ ์ž ์Šค๋ ˆ๋“œ๋ฅผ ํฌํ•จํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฎคํ…์Šค ๋ฝ์„ ์žก์€ ์ฑ„๋กœ ์ข…๋ฃŒํ–ˆ๋‹ค. ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค ๋ฝ์„ ํš๋“ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ƒํƒœ๋ฅผ ์ •์ƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ƒˆ ์†Œ์œ ์ž์˜ ๋ชซ์ด๋‹ค.
EPERM
๋ฎคํ…์Šค ์œ ํ˜•์ด PTHREAD_MUTEX_ERRORCHECK์ด๊ฑฐ๋‚˜ ๋ฎคํ…์Šค๊ฐ€ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค์ด๋ฉฐ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ทธ ๋ฎคํ…์Šค๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค.

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

ETIMEDOUT
pthread_cond_timedwait()์˜ abstime์œผ๋กœ ์ง€์ •ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ๋‹ค.
EINVAL
abstime์— ์ง€์ •ํ•œ ๋‚˜๋…ธ์ดˆ ๊ฐ’์ด 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ 10์–ต ์ด์ƒ์ด๋‹ค.

๋‹ค์Œ ๊ฒฝ์šฐ์— ์ด ํ•จ์ˆ˜๋“ค์ด ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

EOWNERDEAD
๋ฎคํ…์Šค๊ฐ€ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค์ด๋ฉฐ ์ด์ „ ์†Œ์œ ์ž ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค ๋ฝ์„ ์žก์€ ์ฑ„๋กœ ์ข…๋ฃŒํ–ˆ๋‹ค. ํ˜ธ์ถœ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค ๋ฝ์„ ํš๋“ํ•˜๊ฒŒ ๋˜๋ฉฐ ์ƒํƒœ๋ฅผ ์ •์ƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ƒˆ ์†Œ์œ ์ž์˜ ๋ชซ์ด๋‹ค.

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

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

EXAMPLES

์—†์Œ.

APPLICATION USAGE

0 ์•„๋‹Œ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์˜ค๋ฅ˜๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ๋˜ ์‘์šฉ์—์„œ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค๋ฅผ ์“ฐ๋ ค๋ฉด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค. ํ˜„์žฌ ๋น„์ผ๊ด€์ธ ์ƒํƒœ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฎคํ…์Šค๋ฅผ ์Šค๋ ˆ๋“œ๊ฐ€ ์–ป์„ ๋•Œ [EOWNERDEAD]๊ฐ€ ์œ ํšจ ๋ฐ˜ํ™˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฐ์ œํ•˜๊ธฐ์— ์˜ค๋ฅ˜ ๋ฐ˜ํ™˜์„ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š์€ ์‘์šฉ์—์„œ๋Š” ๊ฒฌ๊ณ  ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค. ์‘์šฉ์—์„œ ์ผ๋ฐ˜ ๋ฎคํ…์Šค์™€ ๊ฒฌ๊ณ  ๋ฎคํ…์Šค ๋ชจ๋‘๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋ฉด ๋ชจ๋“  ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์˜ค๋ฅ˜ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ•„์š”์‹œ ์ ์ ˆํ•œ ๋™์ž‘์„ ์ทจํ•ด์•ผ ํ•œ๋‹ค.

RATIONALE

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

์กฐ๊ฑด ๋Œ€๊ธฐ ๋™์ž‘ ๋ฐฉ์‹

pthread_cond_wait()๊ณผ pthread_cond_timedwait()์ด ์˜ค๋ฅ˜ ์—†์ด ๋ฐ˜ํ™˜ํ•  ๋•Œ์—๋„ ์—ฐ๊ด€ ์ˆ ์–ด๊ฐ€ ๊ฑฐ์ง“์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋งค์šฐ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ pthread_cond_timedwait()์ด ํƒ€์ž„์•„์›ƒ ์˜ค๋ฅ˜๋กœ ๋ฐ˜ํ™˜ํ•  ๋•Œ์— ํƒ€์ž„์•„์›ƒ ๋งŒ๋ฃŒ์™€ ์ˆ ๋ถ€ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ฐ„์˜ ๋ถˆ๊ฐ€ํ”ผํ•œ ๊ฒฝ์Ÿ ๋•Œ๋ฌธ์— ์—ฐ๊ด€ ์ˆ ์–ด๊ฐ€ ์ฐธ์ผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜ํ™˜ ์‹œ์— ๊ทธ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ, ๊ทธ๋ฆฌ๊ณ  ์—†๋‹ค๋ฉด ์‹ ํ˜ธ๊ฐ€ ์œ ์‹ค๋œ ๊ฒƒ์ธ์ง€๋ฅผ ํ™•์‹ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‘์šฉ์—์„œ ์ˆ ์–ด๋ฅผ ๋‹ค์‹œ ๊ฒ€์‚ฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ˆ ์–ด๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ถ€๋‹ด์„ ์‘์šฉ์ด ์ง„๋‹ค.

์ผ๋ถ€ ๊ตฌํ˜„์—์„œ๋Š” ๋‹ค์ค‘ ํ”„๋กœ์„ธ์„œ ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์—์„œ ์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋™์‹œ์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ์— ๋•Œ๋กœ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์–ด๋‚˜๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์กฐ๊ฑด ๋Œ€๊ธฐ์—์„œ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ์—์„œ ๊ทธ ์กฐ๊ฑด ๋Œ€๊ธฐ์™€ ์—ฐ๊ด€๋œ ์ˆ ์–ด๋ฅผ ์žฌํ‰๊ฐ€ํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด ๋‹ค์‹œ ๋Œ€๊ธฐํ•˜๊ฑฐ๋‚˜ ํƒ€์ž„์•„์›ƒ์„ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค. ๋Œ€๊ธฐ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์—๋Š” ์—ฐ๊ด€ ์ˆ ์–ด๊ฐ€ ์ฐธ์ด๋‚˜ ๊ฑฐ์ง“ ์ค‘ ์–ด๋А ํ•œ์ชฝ์ด๋ผ๋Š” ํ•จ์˜๊ฐ€ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ์ˆ ์–ด๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” "while ๋ฃจํ”„" ๋“ฑ๊ฐ€๋ฌผ๋กœ ์กฐ๊ฑด ๋Œ€๊ธฐ๋ฅผ ๊ฐ์‹ธ๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

์‹œํ•œ ๋Œ€๊ธฐ ๋™์ž‘ ๋ฐฉ์‹

ํƒ€์ž„์•„์›ƒ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ง€์ •์— ์ ˆ๋Œ€ ์‹œ๊ฐ„ ์ฒ™๋„๋ฅผ ํƒํ•œ ๋ฐ๋Š” ๋‘ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค. ์ฒซ์งธ๋กœ, ์ ˆ๋Œ€ ์‹œ๊ฐ„ ์ง€์ • ํ•จ์ˆ˜ ์ƒ์—์„œ ์ƒ๋Œ€ ์‹œ๊ฐ„ ์ฒ™๋„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€๋งŒ ์ƒ๋Œ€ ํƒ€์ž„์•„์›ƒ ์ง€์ • ํ•จ์ˆ˜ ์ƒ์—์„œ ์ ˆ๋Œ€ ํƒ€์ž„์•„์›ƒ์„ ์ง€์ •ํ•˜๋Š” ๋ฐ๋Š” ๊ฒฝ์Ÿ ์กฐ๊ฑด์ด ์—ฎ์ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด clock_gettime()์ด ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  cond_relative_timed_wait()์ด ์ƒ๋Œ€ ํƒ€์ž„์•„์›ƒ์„ ์“ด๋‹ค๊ณ  ํ•˜์ž.

clock_gettime(CLOCK_REALTIME, &now);
reltime = sleep_til_this_absolute_time -now;
cond_relative_timed_wait(c, m, &reltime);

์ฒซ ๋ฒˆ์งธ ๋ฌธ๊ณผ ๋งˆ์ง€๋ง‰ ๋ฌธ ์‚ฌ์ด์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ์„ ์ ๋˜๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๋ธ”๋ก ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ ˆ๋Œ€ ํƒ€์ž„์•„์›ƒ์„ ์“ฐ๋ฉด ๋ฌธ์ œ๊ฐ€ ์•ˆ ๋œ๋‹ค. ๋˜ํ•œ ์ ˆ๋Œ€ ํƒ€์ž„์•„์›ƒ์€ ์กฐ๊ฑด ๋Œ€๊ธฐ๋ฅผ ๊ฐ์‹ธ๋Š” ๋ฃจํ”„ ๋“ฑ์—์„œ ์‚ฌ์šฉ ์‹œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์šด์šฉ์ž๊ฐ€ ์‹œ์Šคํ…œ ํด๋Ÿญ์„ ๋ถˆ์—ฐ์†์ ์œผ๋กœ ์ „์ง„์‹œํ‚ค๋Š” ๊ฒฝ์šฐ์— ๊ตฌํ˜„์—์„œ๋Š” ์กฐ์ • ์‹œ์ ์— ๋งŒ๋ฃŒ๋˜๋Š” ์‹œํ•œ ๋Œ€๊ธฐ๋ฅผ ์‹ค์ œ ๊ทธ ์‹œ๊ฐ„์„ ๊ฑฐ์นœ ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•œ๋‹ค.

์ทจ์†Œ์™€ ์กฐ๊ฑด ๋Œ€๊ธฐ

์กฐ๊ฑด ๋Œ€๊ธฐ๋Š” ์‹œํ•œ์ด ์žˆ๋“  ์—†๋Š” ์ทจ์†Œ์ ์ด๋‹ค. ์ฆ‰ ํ•จ์ˆ˜ pthread_cond_wait() ๋‚ด์ง€ pthread_cond_timedwait()๊ฐ€ ๋ฏธ์ฒ˜๋ฆฌ (๋˜๋Š” ๋™์‹œ์˜) ์ทจ์†Œ ์š”์ฒญ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€์ ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•œ ์ด์œ ๋Š” ๊ทธ ์ง€์ ์—์„œ ๋ฌดํ•œ ๋Œ€๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฌด์—‡์ด๋“  ๊ฐ„์— ํ”„๋กœ๊ทธ๋žจ์ด ์™„๋ฒฝํ•˜๊ฒŒ ์˜ฌ๋ฐ”๋ฅด๋‹ค ํ•ด๋„ ์ด๋ฒคํŠธ๊ฐ€ ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ์–ด๋–ค ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ˆ๋Œ€ ์ „์†ก๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์กฐ๊ฑด ๋Œ€๊ธฐ๋ฅผ ์ทจ์†Œ์ ์œผ๋กœ ๋งŒ๋“ค๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์–ด๋–ค ๋ฌดํ•œ ๋Œ€๊ธฐ์— ๊ฐ‡ํž ์ˆ˜๋„ ์žˆ์„ ๋•Œ์—๋„ ์Šค๋ ˆ๋“œ๋ฅผ ์ทจ์†Œํ•˜๊ณ  ์ทจ์†Œ ์ •๋ฆฌ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

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

๊ทธ๋ž˜์„œ ๋Œ€๊ธฐ ์ค‘ ์ทจ์†Œ๊ฐ€ ์ „๋‹ฌ๋  ๋•Œ์˜ ๋ฝ ์ƒํƒœ์™€ ๊ด€๋ จํ•ด ๋ญ”๊ฐ€ ์„œ์ˆ ์ด ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์‘์šฉ ์ฝ”๋”ฉ์„ ๊ฐ€๊ธ‰์  ํŽธ๋ฆฌํ•˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์ ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ทœ์ •์„ ์„ ํƒํ•˜์˜€๋‹ค.

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

๋ฎคํ…์Šค์™€ ์กฐ๊ฑด ๋ณ€์ˆ˜์˜ ์„ฑ๋Šฅ

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

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

์กฐ๊ฑด ๋Œ€๊ธฐ์˜ ํšจ์œจ์„ฑ์ด ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ง์ด ์•„๋‹ˆ๋‹ค. Ada ๋ž‘๋ฐ๋ถ€๋งˆ๋‹ค ์ตœ์†Œ ํ•œ ๋ฒˆ์˜ ๋ฌธ๋งฅ ์ „ํ™˜์ด ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ์กฐ๊ฑด ๋ณ€์ˆ˜ ๋Œ€๊ธฐ์˜ ํšจ์œจ์„ฑ์€ ์ค‘์š”ํ•˜๋‹ค. ์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋Œ€๊ธฐํ•˜๋Š” ๋น„์šฉ์€ ๋ฌธ๋งฅ ์ „ํ™˜ ์ตœ์†Œ ๋น„์šฉ์— ๋ฎคํ…์Šค ํ’€๊ณ  ์ž ๊ทธ๋Š” ์‹œ๊ฐ„์„ ๋”ํ•œ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์•„์•ผ ํ•œ๋‹ค.

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

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

๋ฎคํ…์Šค์™€ ์กฐ๊ฑด ๋ณ€์ˆ˜์˜ ์Šค์ผ€์ค„๋ง ๋™์ž‘

์ˆœ์„œ ๊ทœ์น™์„ ์ง€์ •ํ•˜์—ฌ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์— ๊ฐ„์„ญํ•˜๋ ค ํ•˜๋Š” ๋™๊ธฐํ™” ์š”์†Œ๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋ณธ๋‹ค. ๋ฎคํ…์Šค์™€ ์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋“ค ๊ฐ€์šด๋ฐ ์ง„ํ–‰ํ•  ๊ฒƒ์„ ์„ ์ •ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ค ๊ณ ์ •๋œ ์ˆœ์„œ(์˜ˆ๋ฅผ ๋“ค์–ด FIFO๋‚˜ ์šฐ์„ ์ˆœ์œ„)๊ฐ€ ์•„๋‹ˆ๋ผ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์ด ์ขŒ์šฐํ•˜๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ์ด๋ค„์ง„๋‹ค. ์ฆ‰ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์ด ์–ด๋А ์Šค๋ ˆ๋“œ(๋“ค)์ด ๊นจ์–ด๋‚˜์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

์‹œํ•œ ์กฐ๊ฑด ๋Œ€๊ธฐ

pthread_cond_timedwait() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‘์šฉ์—์„œ ์ผ์ • ์‹œ๊ฐ„ ํ›„์— ํŠน์ • ์กฐ๊ฑด์— ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ์„ ํฌ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

(void) pthread_mutex_lock(&t.mn);
    t.waiters++;
    clock_gettime(CLOCK_REALTIME, &ts);
    ts.tv_sec += 5;
    rc = 0;
    while (! mypredicate(&t) && rc == 0)
        rc = pthread_cond_timedwait(&t.cond, &t.mn, &ts);
    t.waiters--;
    if (rc == 0 || mypredicate(&t))
        setmystate(&t);
(void) pthread_mutex_unlock(&t.mn);

ํƒ€์ž„์•„์›ƒ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ ˆ๋Œ“๊ฐ’์ด๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ง„ํ–‰์„ ๋ง‰๋Š” ์ˆ ์–ด๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํƒ€์ž„์•„์›ƒ์ด ์ƒ๋Œ“๊ฐ’์ด์—ˆ๋‹ค๋ฉด ํ˜ธ์ถœ ์ „์— ๋งค๋ฒˆ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ์ˆ ์–ด๊ฐ€ ์ฐธ์ด ๋˜๊ฑฐ๋‚˜ ํƒ€์ž„์•„์›ƒ์ด ๋งŒ๋ฃŒ๋˜๊ธฐ ์ „์˜ ์กฐ๊ฑด ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฐ€์™ธ ๋™๋ณด ๋‚ด์ง€ ์‹ ํ˜ธ๋กœ ์ธํ•œ ๊ฑฐ์ง“ ๊นจ์–ด๋‚จ ๊ฐ€๋Šฅ์„ฑ์„ ๊ทธ ์ฝ”๋“œ์—์„œ ๊ณ ๋ คํ•ด์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋ฏ€๋กœ ํŠนํžˆ ์–ด๋ ค์› ์„ ๊ฒƒ์ด๋‹ค.

FUTURE DIRECTIONS

์—†์Œ.

SEE ALSO

pthread_cond_broadcast()

POSIX.1-2008 Base Definitions ๊ถŒ, 4.11์ ˆ Memory Synchronization, <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** โš ๏ธ