memset
c
// 메모리의 내용을 원하는 크기만큼 특정한 값으로 세팅할 수 있는 함수
char arr[] = "blockdmask";
memset(arr, 'c', 5 * sizeof(char));
1st 인자 : 변경하고자 하는 목적지의 첫번째 주소 (포인터)
2nd 인자 : 넣고 싶은 특정한 값
3rd 인자 : 크기
usleep
c
// 지정한 값(단위: 마이크로초) 만큼 대기 상태
void usleep(unsigned long useconds);
gettimeofday
c
int gettimeofday(struct timeval *restrict tp, void *restrict tzp)
1번째 인자 : 1970-01-01 00:00:00 +0000 (UTC) 이후 경과된 초(seconds)와
micro초를 저장할 buffer
2번째 인자 : NULL 넣으면 됨.
쓰레드 관련 함수
c
int pthread_create(&thread, NULL, ft_thread, NULL);
// 새 쓰레드를 생성
1st 인자 : 쓰레드 아이디
2nd 인자 : 쓰레드의 특성 정의. 기본적으로 NULL.
3rd 인자 : (void *)를 반환하는함수
4th 인자 : 3rd 인자 = 함수의 파라미터
반환값 : 성공 / 실패 여부. 성공 시 0
< 쓰레드 해제 함수>
int pthread_join(thread, void **return_value);
// 쓰레드가 끝날 때까지 대기한 후 해제
return_value : thread의 리턴값이 저장됨.
반환값 : 성공 / 실패 여부. 성공 시 0
int pthread_detach(thread);
// 쓰레드를 즉시 종료하고 바로 해제
뮤택스 관련 함수
c
pthread_mutex_t mutex_lock;
// 뮤택스 (=구조체)
pthread_mutex_init(&mutex_lock, attr);
// 뮤택스를 생성하는 함수
mutex_lock : 생성할 뮤택스
attr : 뮤택스의 특성. 기본적으로 NULL.
반환값 : 성공 / 실패 여부. 성공 시 0
pthread_mutex_destroy(&mutex_lock);
// 뮤택스를 해제하는 함수
mutex_lock : 해제할 뮤택스
제거하려면 그 뮤택스는 반드시 unlock 상태여야 함.
반환값 : 성공 / 실패 여부. 성공 시 0
< 임계구역 관련 함수 >
pthread_mutex_lock(&mutex_lock);
// 임계구역 시작
pthread_mutex_unlock(&mutex_lock);
// 임계구역 해제
예시 : 쓰레드와 뮤택스
c
void *ft_eat(void *arg)
{
t_box *tools;
tools = (t_box *)arg;
pthread_mutex_lock(tools->fork);
for (int i = 0; i < 100; i++)
printf("%d ", i);
pthread_mutex_unlock(tools->fork);
return (arg);
}
int philo_execute(t_box *tools, t_philo **philo)
{
int i;
i = 0;
tools->fork = malloc(sizeof(pthread_mutex_t) * tools->philo_num);
if (!tools->fork)
return (1);
pthread_mutex_init(tools->fork, NULL);
while (i < tools->philo_num)
pthread_create(&philo[i++]->thread_id, NULL, ft_eat, (void *)tools);
i = 0;
while (i < tools->philo_num)
pthread_join(philo[i++]->thread_id, NULL);
free(tools->fork);
return (0);
}