pthread_cond_timedwait(3p) - wariua/manpages-ko GitHub Wiki
์ด ๋งค๋ด์ผ ํ์ด์ง๋ POSIX ํ๋ก๊ทธ๋๋จธ ๋งค๋ด์ผ์ ์ผ๋ถ์ด๋ค. ์ด ์ธํฐํ์ด์ค์ ๋ฆฌ๋ ์ค ๊ตฌํ์ ์ฐจ์ด๊ฐ ์์ ์ ์์ผ๋ฉฐ (์์ธํ ๋ฆฌ๋ ์ค ๋์ ๋ฐฉ์์ ํด๋น ๋ฆฌ๋ ์ค ๋งค๋ด์ผ ํ์ด์ง ์ฐธ๊ณ ) ๋ฆฌ๋ ์ค์์ ์ด ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ๋์ด ์์ง ์์ ์๋ ์๋ค.
pthread_cond_timedwait, pthread_cond_wait - ์กฐ๊ฑด ๊ธฐ๋ค๋ฆฌ๊ธฐ
#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);
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
์ธ์๋ก ์ง์ ํ ๊ฐ์ด ๊ฐ๊ฐ ์ด๊ธฐํ ๋ ์กฐ๊ฑด ๋ณ์ ๊ฐ์ฒด์ ์ด๊ธฐํ ๋ ๋ฎคํ
์ค ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ง ์์ ๊ฒฝ์ฐ์ ๋์ ๋ฐฉ์์ ๊ท์ ๋์ด ์์ง ์๋ค.
[ETIMEDOUT]
๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ์ด ์ค๋ฅ ๊ฒ์ฌ๋ค์ ๋ชจ๋ ํจ์ ์ฒ๋ฆฌ ์์ ์งํ์ ์ํ๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ฉฐ ํจ๊ณผ์ mutex
๋ก ์ง์ ํ ๋ฎคํ
์ค๋ cond
๋ก ์ง์ ํ ์กฐ๊ฑด ๋ณ์์ ์ํ ๋ณ๊ฒฝ ์ ์ ์ค๋ฅ ๋ฐํ์ ์ ๋ฐํ๋ค.
์ฑ๊ณต ์๋ฃ์ 0 ๊ฐ์ ๋ฐํํ๋ค. ์๋๋ฉด ์ค๋ฅ๋ฅผ ๋ํ๋ด๋ ์ค๋ฅ ๋ฒํธ๋ฅผ ๋ฐํํ๋ค.
๋ค์ ๊ฒฝ์ฐ์ ์ด ํจ์๋ค์ด ์คํจํ๋ค.
ENOTRECOVERABLE
- ๋ฎคํ ์ค๊ฐ ๋ณดํธํ๋ ์ํ๊ฐ ๋ณต๊ตฌ ๊ฐ๋ฅํ์ง ์๋ค.
EOWNERDEAD
- ๋ฎคํ ์ค๊ฐ ๊ฒฌ๊ณ ๋ฎคํ ์ค์ด๋ฉฐ ์ด์ ์์ ์ ์ค๋ ๋๋ฅผ ํฌํจํ ํ๋ก์ธ์ค๊ฐ ๋ฎคํ ์ค ๋ฝ์ ์ก์ ์ฑ๋ก ์ข ๋ฃํ๋ค. ํธ์ถ ์ค๋ ๋๊ฐ ๋ฎคํ ์ค ๋ฝ์ ํ๋ํ๊ฒ ๋๋ฉฐ ์ํ๋ฅผ ์ ์์ผ๋ก ๋ง๋๋ ๊ฒ์ ์ ์์ ์์ ๋ชซ์ด๋ค.
EPERM
- ๋ฎคํ
์ค ์ ํ์ด
PTHREAD_MUTEX_ERRORCHECK
์ด๊ฑฐ๋ ๋ฎคํ ์ค๊ฐ ๊ฒฌ๊ณ ๋ฎคํ ์ค์ด๋ฉฐ ํ์ฌ ์ค๋ ๋๊ฐ ๊ทธ ๋ฎคํ ์ค๋ฅผ ์์ ํ๊ณ ์์ง ์๋ค.
๋ค์ ๊ฒฝ์ฐ์ pthread_cond_timedwait()
ํจ์๊ฐ ์คํจํ๋ค.
ETIMEDOUT
-
pthread_cond_timedwait()
์abstime
์ผ๋ก ์ง์ ํ ์๊ฐ์ด ์ง๋ฌ๋ค. EINVAL
-
abstime
์ ์ง์ ํ ๋๋ ธ์ด ๊ฐ์ด 0๋ณด๋ค ์๊ฑฐ๋ 10์ต ์ด์์ด๋ค.
๋ค์ ๊ฒฝ์ฐ์ ์ด ํจ์๋ค์ด ์คํจํ ์๋ ์๋ค.
EOWNERDEAD
- ๋ฎคํ ์ค๊ฐ ๊ฒฌ๊ณ ๋ฎคํ ์ค์ด๋ฉฐ ์ด์ ์์ ์ ์ค๋ ๋๊ฐ ๋ฎคํ ์ค ๋ฝ์ ์ก์ ์ฑ๋ก ์ข ๋ฃํ๋ค. ํธ์ถ ์ค๋ ๋๊ฐ ๋ฎคํ ์ค ๋ฝ์ ํ๋ํ๊ฒ ๋๋ฉฐ ์ํ๋ฅผ ์ ์์ผ๋ก ๋ง๋๋ ๊ฒ์ ์ ์์ ์์ ๋ชซ์ด๋ค.
์ด ํจ์๋ ์ค๋ฅ ์ฝ๋ [EINTR]
์ ๋ฐํํ์ง ์๋๋ค.
์ดํ๋ ๊ท๋ฒ์ ์ด์ง ์์ ๋ด์ฉ์ด๋ค.
์์.
0 ์๋ ๋ฐํ ๊ฐ์ด ์ค๋ฅ๋ผ๊ณ ๊ฐ์ ํ๋ ์์ฉ์์ ๊ฒฌ๊ณ ๋ฎคํ
์ค๋ฅผ ์ฐ๋ ค๋ฉด ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒ์ด๋ค. ํ์ฌ ๋น์ผ๊ด์ธ ์ํ๋ฅผ ๋ณดํธํ๋ ๋ฎคํ
์ค๋ฅผ ์ค๋ ๋๊ฐ ์ป์ ๋ [EOWNERDEAD]
๊ฐ ์ ํจ ๋ฐํ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ๋ฐฐ์ ํ๊ธฐ์ ์ค๋ฅ ๋ฐํ์ ๊ฒ์ฌํ์ง ์์ ์์ฉ์์๋ ๊ฒฌ๊ณ ๋ฎคํ
์ค๋ฅผ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ค. ์์ฉ์์ ์ผ๋ฐ ๋ฎคํ
์ค์ ๊ฒฌ๊ณ ๋ฎคํ
์ค ๋ชจ๋๋ฅผ ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค๋ฉด ๋ชจ๋ ๋ฐํ ๊ฐ์ ์ค๋ฅ ์กฐ๊ฑด์ ๊ฒ์ฌํ๊ณ ํ์์ ์ ์ ํ ๋์์ ์ทจํด์ผ ํ๋ค.
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);
ํ์์์ ๋งค๊ฐ๋ณ์๊ฐ ์ ๋๊ฐ์ด๋ฏ๋ก ํ๋ก๊ทธ๋จ์์ ์งํ์ ๋ง๋ ์ ์ด๋ฅผ ๊ฒ์ฌํ ๋๋ง๋ค ๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์๋ค. ํ์์์์ด ์๋๊ฐ์ด์๋ค๋ฉด ํธ์ถ ์ ์ ๋งค๋ฒ ๋ค์ ๊ณ์ฐํด์ผ ํ์ ๊ฒ์ด๋ค. ๋ํ ์ ์ด๊ฐ ์ฐธ์ด ๋๊ฑฐ๋ ํ์์์์ด ๋ง๋ฃ๋๊ธฐ ์ ์ ์กฐ๊ฑด ๋ณ์์ ๋ํ ๊ฐ์ธ ๋๋ณด ๋ด์ง ์ ํธ๋ก ์ธํ ๊ฑฐ์ง ๊นจ์ด๋จ ๊ฐ๋ฅ์ฑ์ ๊ทธ ์ฝ๋์์ ๊ณ ๋ คํด์ผ ํ์ ๊ฒ์ด๋ฏ๋ก ํนํ ์ด๋ ค์ ์ ๊ฒ์ด๋ค.
์์.
POSIX.1-2008 Base Definitions ๊ถ, 4.11์ Memory Synchronization, <pthread.h>
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