Philosopher
과제를 위해서는 C언어 스레드 함수들과, semaphore
, mutex
관련 함수들에 대한 학습이 어느정도 필요하다
스레드 관련 함수들은 다른 언어에서도 형태가 어느정도 비슷하기 때문에 확실하게 학습해 두는 것이 좋다.
pthread를 이용해 코드를 짜게 되면 컴파일 옵션으로 -Ipthread를 주어야 한다는 점을 잊지 말자.
의존성
#include <pthread.h>
함수 원형
int pthread_create(pthread_t *thread_id, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
- 스레드를 생성하는 함수
*thread_id
: pthread 식별자이다. thread가 제대로 생성되었다면 thread의 식별값이 저장된다.*attr
: pthread 속성(특성)이다. 기본적인 스레드 특성을 이용하고자 하면 NULL을 사용하면 된다.
- attr
Detach state = PTHREAD_CREATE_JOINABLE Scope = PTHREAD_SCOPE_SYSTEM Inherit scheduler = PTHREAD_INHERIT_SCHED Scheduling policy = SCHED_OTHER Scheduling priority = 0 Guard size = 4096 bytes Stack address = 0x40196000 Stack size = 0x201000 bytes
*(*start_routine)(void *)
: 스레드가 분기되었을 때 스레드에서 실행하는 함수이다. 스레드 함수의 매개변수는pthread_create
함수의 네 번째 인자를 받는다.*arg
:*(*start_routine)(void *)
의 매개변수로 넘겨지는 인자이다.- return
- 성공 : 0
- 실패 : set errno
해당 함수를 이용하여 스레드를 만들 수 있다. 스레드들은 프로세스 내의 데이터 영역을 공유하지만, 각각의 스레드끼리 독립적인 스택영역을 가지고, 각자의 PC(Program counter
)를 가지므로 이를 유의하여 코드를 짜야한다.
해당 코드는 메인 스레드의 i를 인자로 받은 스레드와 메인 스레드가 번갈아가며 각각의 문자열을 출력하는 코드이다.
의존성
#include <pthread.h>
함수 원형
int pthread_join(pthread_t *thread_id, void **value_ptr);
- 스레드 종료를 대기하는 함수
*thread_id
: pthread 식별자이다.**value_ptr
: 대기하던 스레드가 종료되면 대기하던 스레드의pthread_exit()
함수가 전달한exit value
를 받는다.- return
- 성공 : 0
- 실패 : set errno