pthread_mutex_destroy(3p) - wariua/manpages-ko GitHub Wiki
์ด ๋งค๋ด์ผ ํ์ด์ง๋ POSIX ํ๋ก๊ทธ๋๋จธ ๋งค๋ด์ผ์ ์ผ๋ถ์ด๋ค. ์ด ์ธํฐํ์ด์ค์ ๋ฆฌ๋ ์ค ๊ตฌํ์ ์ฐจ์ด๊ฐ ์์ ์ ์์ผ๋ฉฐ (์์ธํ ๋ฆฌ๋ ์ค ๋์ ๋ฐฉ์์ ํด๋น ๋ฆฌ๋ ์ค ๋งค๋ด์ผ ํ์ด์ง ์ฐธ๊ณ ) ๋ฆฌ๋ ์ค์์ ์ด ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ๋์ด ์์ง ์์ ์๋ ์๋ค.
pthread_mutex_destroy, pthread_mutex_init - ๋ฎคํ ์ค ํ๊ธฐ ๋ฐ ์ด๊ธฐํ
#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;
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
์ธ์๋ก ์ง์ ํ ๊ฐ์ด ์ด๊ธฐํ ๋ ๋ฎคํ
์ค ์์ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์ง ์์ ๊ฒฝ์ฐ์ ๋์ ๋ฐฉ์์ ๊ท์ ๋์ด ์์ง ์๋ค.
์ฑ๊ณต ์ pthread_mutex_destroy()
์ pthread_mutex_init()
ํจ์๋ 0์ ๋ฐํํ๋ค. ์๋๋ฉด ์ค๋ฅ๋ฅผ ๋ํ๋ด๋ ์ค๋ฅ ๋ฒํธ๋ฅผ ๋ฐํํ๋ค.
๋ค์ ๊ฒฝ์ฐ์ pthread_mutex_init()
ํจ์๊ฐ ์คํจํ๋ค.
EAGAIN
- ๋ฎคํ ์ค๋ฅผ ์๋ก ์ด๊ธฐํ ํ๋ ๋ฐ ํ์ํ (๋ฉ๋ชจ๋ฆฌ ์ธ์) ์์์ด ์์คํ ์ ๋ถ์กฑํ๋ค.
ENOMEM
- ๋ฎคํ ์ค๋ฅผ ์ด๊ธฐํ ํ๊ธฐ์ ์ถฉ๋ถํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ค.
EPERM
- ํธ์ถ์์๊ฒ ๋์์ ์ํํ๊ธฐ ์ํ ํน๊ถ์ด ์๋ค.
๋ค์ ๊ฒฝ์ฐ์ pthread_mutex_init()
ํจ์๊ฐ ์คํจํ ์๋ ์๋ค.
EINVAL
-
attr
์ด ๊ฐ๋ฆฌํค๋ ์์ฑ ๊ฐ์ฒด์ ๊ฒฌ๊ณ ๋ฎคํ ์ค ์์ฑ์ด ์ค์ ๋์ด ์์ผ๋ฉด์ ํ๋ก์ธ์ค ๊ณต์ ์์ฑ์ด ์ค์ ๋์ด ์์ง ์๋ค.
์ด ํจ์๋ค์ ์ค๋ฅ ์ฝ๋ [EINTR]
์ ๋ฐํํ์ง ์๋๋ค.
์ดํ๋ ๊ท๋ฒ์ ์ด์ง ์์ ๋ด์ฉ์ด๋ค.
์์.
์์.
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
์ผ๋ก ์ค์ ๋์ด ์์ ๋ ๊ฒฌ๊ณ ๋ฎคํ
์ค๋ฅผ ์ ๊ณตํ ์ ์๋ ํ์๋ ์๋๋ค.
์์.
pthread_mutex_getprioceiling(), pthread_mutex_getrobust(), pthread_mutex_lock(), pthread_mutex_timedlock(), pthread_mutexattr_getpshared()
POSIX.1-2008 Base Definitions ๊ถ, <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