Philo_one
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
참고사이트
허용함수
usleep
#include <unistd.h>
int usleep(useconds_t microseconds);
gettimeofday
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp, void *restrict tzp);
-> 각 구조체 내용
struct timeval {
time_t tv_sec; /* seconds since Jan. 1, 1970 */
suseconds_t tv_usec; /* and microseconds */
};
struct timezone {
int tz_minuteswest; /* of Greenwich */
int tz_dsttime; /* type of dst correction to apply */
};
⇒ 현재 timezone 구조체는 사용되지 않고 있으며, 앞으로도 지원되지 않을 것이다. 간혹 커널 소스등에서 이 필드가 사용되는 경우가 있는데, 모든 경우에 버그로 판단되어서 무시한다. 복잡하게 생각할 필요 없이 tz은 NULL을 사용하도록 한다.
- ⇒ 성공시 0 리턴, 실패시 -1 리턴
pthread_create
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void *), void *arg);
⇒ attr을 통해 설정된 값으로 thread를 만드는 함수⇒ attr이 나중에 수정되더라도 thread에 영향을 주지 않는다.
⇒ 성공시 0리턴
⇒ attr이 0이라면 default attr이 사용된다.
pthread_detach
#include <pthread.h>
int pthread_detach(pthread_t thread);
⇒ 특정 쓰레드를 분리시킵니다.
=> 반면 pthread_join() 을 사용하여 종료될때까지 기다렸다가 종료시점이 되면, 자원이 반납됩니다.
출처: https://bitsoul.tistory.com/161
pthread_detach() 함수는 pthread_join()을 사용하지 않더라도, 쓰레드 종료될때 모든 자원을 해제 됩니다
⇒ '일반적'으로 쓰레드를 pthread_create() 를 사용하여 생성하면, 쓰레드가 종료되더라도 사용했던 모든 자원이 해제되지 않습니다. (헉!)
pthread_join
#include <pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);
⇒ 성공시 0리턴첫번째 매개변수 th 는 기다릴 쓰레드의 식별자.
두번째 매개변수 thread_return 은 쓰레드의 리턴값.
thread_return 이 NULL이 아닌 경우 해당 포인터로 쓰레드의 리턴 값을 받아올수 있습니다.
출처: https://bitsoul.tistory.com/160
⇒ 특정 쓰레드가 종료하기를 기다렸다가, 쓰레그가 종료된 이후 다음 진행
pthread_mutex_init
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, pthreadmutexattr_t *attr);
⇒ attr 에 따라 새 뮤텍스를 만드는 함수
⇒ 성공시 0리턴, 에러시 에러코드 리턴
⇒ attr 이 0이면 기본 attr 값으로 사용된다
pthread_mutex_destroy
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
⇒ 할당된 뮤텍스를 해제해준다.
⇒ 성공시 0리턴, 실패시 에러코드 리턴
pthread_mutex_lock
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
⇒ 뮤텍스를 락하는 함수
⇒ 성공시 0리턴, 실패시 에러코드
⇒ 뮤텍스가 이미 락되어있으면, 뮤텍스가 사용가능할때까지 함수를 호출한 스레드는 기다린다
pthread_mutex_unlock
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
⇒ 락된 뮤텍스를 언락 하는 함수
⇒ 성공시 0리턴, 실패시 에러코드
⇒ 락이 되지않은 뮤텍스에서 함수를 호출하는것은 undefined behavior 이다
Philo_two
memset, printf, malloc, free, write, usleep, gettimeofday, pthread_create, pthread_detach, pthread_join, sem_open, sem_close, sem_post, sem_wait, sem_unlink
참고사이트
허용함수정리
sem_open
#include <semaphore.h>
sem_t *sem_open(const char *name. int oflag, ...);
⇒ name : 세마포어 오브젝트에 이름을 지정하는 문자열
=> flag :
- O_CREAT : 세마포어가 없으면 만들어라
- 이 플래그를 사용하려면 두개의 인자가 추가로 필요하다
- (mode_t mode, unsigned int value)
- mode_t mode : 세마포어 권한설정
- S_IRWXR : 그룹 접근
- S_IRWXO : 타인 접근
- S_IRWXU : 개인 접근
- 플래그를 O_CREAT로 설정하면, mode 인자를 받을 수 있음. <sys/stat.h> 를 인클루드 하면 아래 상수들을 활용할 수 있다.
- unsigned int value
- 세마포어 초기 값으로 0 보다 큰 양수여야 함. unlock된 세마포어의 수를 의미한다. 이 값은 SEM_VALUE_MAX를 초과할 수 없다.
- O_EXCL : 세마포어가 있으면 에러
sem_close
#include <semaphore.h>
int sem_close(sem_t *sem);
⇒ 성공시 0 리턴, 실패시 -1, 에러코드 리턴
sem_post
#include <semaphore.h>
int sem_post(sem_t *sem);
⇒ 성공시 0리턴, 실패시 -1리턴, 에러코드 리턴
⇒ sem에서 참조하는 명명된 세마포어와 연결된 시스템 리소스가 할당 해제되고 descriptor가 무효화됩니다.
sem_wait
#include <semaphore.h>
int sem_wait(sem_t *sem);
⇒ 성공시 0리턴, 실패서 -1, 에러코드 리턴
⇒ sem_wait 호출시 sem이 lock 된다. semaphore의 value 가 0이 된다면
sem_unlink
#include <semaphore.h>
int sem_unlink(const char *name);
⇒ 성공시 0리턴, 실패시 -1, 에러코드 리턴
⇒ name의 세마포어가 삭제된다.
'42seoul > philosophers' 카테고리의 다른 글
프로세스(process)와 세마포어(semaphore) 작성중 (0) | 2021.06.12 |
---|---|
스레드(thread)와 뮤텍스(mutex) (0) | 2021.06.12 |
philosopher subject (1) | 2021.06.06 |