열렬히.뛰기

함수 공부하기

école 42 > philosopher > philosopher : 진행 상황 > 함수 공부하기

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);
}