Philosophers๊ณผ์ ํจ์
memset
, printf
, malloc
, free
, write
, usleep
, gettimeofday
, pthread_create
, pthread_detach
, pthread_join
, pthread_mutex_init
, pthread_mutex_destroy
, pthread_mutex_lock
, pthread_mutex_unlock
1. thread ํจ์
pthread.h : POSIX tread.
pthread_t์ opaque type opaque type : ํด๋น ํ์ ์ ์ ์ฅ๋๋ ์ค์ ๋ฐ์ดํฐ๋ ์์คํ ์ ๊ณ ์ ์ ๋ณด์ด๋ฉฐ, ๊ทธ ์์ ๋ฐ์ดํฐ๋ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ค. ๋ฐ๋ผ์ pthread_t๋ฅผ ์กฐ์ํ๊ธฐ ์ํด์๋ API๊ฐ ์ ๊ณตํด์ฃผ๋ thread๋ฅผ ๋ค๋ฃจ๋ ํจ์๋ค์ ์ฌ์ฉํด์ผํ๋ค. ์ฐธ๊ณ : ๋ณ์ค์ฝ๋ฉ, bigpel66.oopy.io
1.1 pthread_create
#include <pthread.h>
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void *),
void *arg);
์ค๋ ๋๋ฅผ ์์ฑํ๋ ํจ์.
- ์ธ์
pthread_t *thread
: ์ค๋ ๋ ์๋ณ์. ์์ฑ๋ ์ค๋ ๋์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ pthread_t ํฌ์ธํฐ. ๋ค๋ง, ์ด ๊ฐ์ ์ด์์ฒด์ฌ๋ง๋ค ๋ค๋ฅด๊ฒ ์ ์ํ๋ค.const pthread_attr_t *attr
: ์ฐ๋ ๋ ํน์ฑ ์ง์ ํ๋ ์ธ์. ๋ํดํธ ์ฌ์ฉ์ NULL ์ ๋ฌ.void *(*start_routine)(void *)
: ๋ถ๊ธฐ์์ผ์ ์คํ์ํฌ ์ค๋ ๋ ํจ์.void *arg
: start_routine์ ์ธ์.
- ๋ฐํ๊ฐ
- ์ฑ๊ณต์ 0, ์คํจ์ error number ๋ฐํ
1.2 pthread_detach
#include <pthread.h>
int pthread_detach(pthread_t thread);
์ ๋ ฅ๋ ์ค๋ ๋๋ฅผ ๋ฐ๋ก ์ข ๋ฃ์ํค๋ ํจ์. ์์ฑ๋ ์ค๋ ๋์ ์์์ ์ค๋ ๋ ์ข ๋ฃ์ฌ ์ง๋์ผ๋ก ํด์ ๋์ง ์๊ณ , pthread_detach๋ pthread_join์ ํตํด์ ํด์ ์์ผ์ผํ๋ค.
- ์ธ์
pthread_t thread
: ์ค๋ ๋
- ๋ฐํ
- ์ฑ๊ณต์ 0, ์คํจ์ error number ๋ฐํ
1.3 pthread_join
#include <pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);
์ ๋ ฅ๋ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ํจ์. ํด๋น ์ค๋ ๋์ ๋ฆฌํด๊ฐ์ ๋ฐ์์ฌ์ ์๋ค.
- ์ธ์
pthread_t thread
: ์ค๋ ๋void **value_ptr
: ์ค๋ ๋์ ๋ฆฌํด๊ฐ(void *
)์ ๋ฐ์์ฌ ๋ณ์.
- ๋ฐํ
- ์ฑ๊ณต์ 0, ์คํจ์ error number ๋ฐํ
2. ๋ฎคํ ์ค
๋ฎคํ ์ค๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ์์์ ๋ณดํธํ๋ ์ผ์ข ์ ๋ฐ์ดํฐ ์ ๊ธ์ฅ์น์ด๋ค. ์ด ๋ฎคํ ์ค๋ก ๋ณดํธ๋๋ ์์ญ์๋ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์ด ์์ญ์ ์๊ณ๊ตฌ์ญ์ด๋ผ๊ณ ํ๋ค.
2.1 pthread_mutex_init
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
์ ๊ทธ๊ณ ์ถ์ ์์ญ ํ๋๋ค ํ๋์ ์๋ฌผ์ ๊ฐ ํ์ํ๋ค. ์ด๋ ์ด ์๋ฌผ์ ์ ์ญํ ์ ํ๋๊ฒ ๋ฎคํ
์ค ๊ฐ์ฒด?๊ตฌ์กฐ์ฒด(pthread_mutex_t
)์ด๋ฏ๋ก ์๊ณ๊ตฌ์ญ๊ฐ์๋งํผ ๋ฎคํ
์ค ๊ฐ์ฒด ๋ํ ์ด๊ธฐํ์์ผ์ค์ผํ๋ค.
- ์ธ์
pthread_mutex_t *mutex
: ์ด๊ธฐํ ์ํฌ ๋ฎคํ ์ค ๊ตฌ์กฐ์ฒดconst pthread_mutexattr_t *attr
: ๋ฎคํ ์ค์ ํน์ฑ์ ์ง์ ํ๋ ์ธ์. ๋ํดํธ ์ฌ์ฉ์ NULL ์ ๋ฌ.
- ๋ฐํ
- ์ฑ๊ณต์ 0, ์คํจ์ error number ๋ฐํ
2.2 pthread_mutex_destroy
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
- ์ธ์
pthread_mutex_t *mutex
: ํ๊ดดํ ๋ฎคํ ์ค ๊ตฌ์กฐ์ฒด(์ฌ์ฉ์ด ๋๋จ)
- ๋ฐํ
- ์ฑ๊ณต์ 0, ์คํจ์ error number ๋ฐํ
2.3 pthread_mutex_lock
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
- ์ธ์
pthread_mutex_t *mutex
: ์๊ณ๊ตฌ์ญ์ ์ ๊ทธ๊ธฐ์ํด ์ฌ์ฉํ ๋ฎคํ ์ค ๊ตฌ์กฐ์ฒด
- ๋ฐํ
- ์ฑ๊ณต์ 0, ์คํจ์ error number ๋ฐํ
2.4 pthread_mutex_unlock
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
- ์ธ์
pthread_mutex_t *mutex
: ํด๋น ์๊ณ๊ตฌ์ญ์ ์ ๊ทธ๊ธฐ์ํด ์ฌ์ฉํ ๋ฎคํ ์ค ๊ตฌ์กฐ์ฒด
- ๋ฐํ
- ์ฑ๊ณต์ 0, ์คํจ์ error number ๋ฐํ