42seoul/philosophers

philosopher 허용함수 정리

syom 2021. 6. 6. 21:06

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 :

  1. 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를 초과할 수 없다.
  2. 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