[philosophers] mutex란?

J_JEON·2022년 9월 6일
0

Philosophers

목록 보기
3/5

mutex

  • 여러 스레드나 프로세스에서 하나의 공유자원을 사용하여 누군가는 값을 변경시키고, 누군가는 값을 읽는것이 동시에 일어나 잘못된 값을 읽어오는 등의 문제를 해결하기위해 사용
  • 특정 구역을 하나의 프로세스만 접근할 수 있는 임계구역으로 만들고 사용중일 때는 lock을 걸어 다른 프로세스는 접근하지 못하도록 하고 다 사용했을때에는 unlock하여 다른 프로세스가 접근할 수 있도록 함
    ex)
mutexlock // lock
----------임계구역----------


----------임계구역----------
mutexunlock // unlock

pthread_mutex_init

pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *restrict attr)

mutex를 사용하기위해 pthread_mutex_t를 초기화해주는 함수
첫번째 인자는 mutex, 두번째 인자는 옵션이며 기본적으로 NULL을 사용함
성공시 0반환, 실패시 에러넘버를 반환함

ptherad_mutex_lock

pthread_mutex_lock(pthread_mutex_t *mutex);

임계구역에 하나의 프로세스만 접근할 수 있도록 lock을 걸어주는 함수

ptherad_mutex_unlock

pthread_mutex_unlock(pthread_mutex_t *mutex);

lock이 걸린 임계구역에 다른 프로세스가 접근할 수 있도록 lock을 풀어주는 함수

pthread_mutex_destroy

pthread_mutex_destroy(pthread_mutex_t *mutex);

init으로 초기화한 mutex가 더이상 사용되지않을 때 리소스를 해제시켜주는 함수

사용예제

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

typedef struct s_param
{
	pthread_t		tid[3]; // 3개의 스레드
	pthread_mutex_t	get; // mutex
	int				i; // 공유자원
}				t_param;

void	*print_thread(void *par)
{
	t_param	*param;

	param = (t_param *)par;
	while (param->i < 10)
	{
		pthread_mutex_lock(&param->get); // 임계구역 lock
		printf("%d ", param->i);
		param->i++;
		pthread_mutex_unlock(&param->get); // 임계구역 unlock
        usleep(1);
	}
	return (0);
}

int	main(void)
{
	t_param			param;
	void			*param_v;

	param.i = 0;
	param_v = (void *)&param;
	pthread_mutex_init(&param.get, NULL); // mutex 초기화
	pthread_create(&param.tid[0], NULL, print_thread, param_v); // 스레드 생성
	pthread_create(&param.tid[1], NULL, print_thread, param_v);
	pthread_create(&param.tid[2], NULL, print_thread, param_v);
	pthread_join(param.tid[0], NULL); // 스레드 종료 후 리소스 회수
	pthread_join(param.tid[1], NULL);
	pthread_join(param.tid[2], NULL);
    pthread_mutex_destroy(&param.get); // mutex 리소스 회수
	return (0);
}

mutex를 사용하지않으면 각각의 스레드가 출력과 값증가를 동시에 시켜 값들이 이상하게 출력됨

mutex를 사용하면 한번에 하나의 스레드만 값을 출력하고 증가시키기때문에 순서대로 출력됨

profile
늅늅

2개의 댓글

comment-user-thumbnail
2023년 10월 3일

여기서 int i; // 공유자원으로 주셨는데, 어떤 역할을 하는지 설명해주실수있을까요?ㅠ

1개의 답글