- 여러 스레드나 프로세스에서 하나의 공유자원을 사용하여 누군가는 값을 변경시키고, 누군가는 값을 읽는것이 동시에 일어나 잘못된 값을 읽어오는 등의 문제를 해결하기위해 사용
- 특정 구역을 하나의 프로세스만 접근할 수 있는 임계구역으로 만들고 사용중일 때는 lock을 걸어 다른 프로세스는 접근하지 못하도록 하고 다 사용했을때에는 unlock하여 다른 프로세스가 접근할 수 있도록 함
ex)mutexlock // lock ----------임계구역---------- ----------임계구역---------- mutexunlock // unlock
pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *restrict attr)
mutex를 사용하기위해 pthread_mutex_t를 초기화해주는 함수
첫번째 인자는 mutex, 두번째 인자는 옵션이며 기본적으로 NULL을 사용함
성공시 0반환, 실패시 에러넘버를 반환함
pthread_mutex_lock(pthread_mutex_t *mutex);
임계구역에 하나의 프로세스만 접근할 수 있도록 lock을 걸어주는 함수
pthread_mutex_unlock(pthread_mutex_t *mutex);
lock이 걸린 임계구역에 다른 프로세스가 접근할 수 있도록 lock을 풀어주는 함수
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(¶m->get); // 임계구역 lock printf("%d ", param->i); param->i++; pthread_mutex_unlock(¶m->get); // 임계구역 unlock usleep(1); } return (0); } int main(void) { t_param param; void *param_v; param.i = 0; param_v = (void *)¶m; pthread_mutex_init(¶m.get, NULL); // mutex 초기화 pthread_create(¶m.tid[0], NULL, print_thread, param_v); // 스레드 생성 pthread_create(¶m.tid[1], NULL, print_thread, param_v); pthread_create(¶m.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(¶m.get); // mutex 리소스 회수 return (0); }
mutex를 사용하지않으면 각각의 스레드가 출력과 값증가를 동시에 시켜 값들이 이상하게 출력됨
mutex를 사용하면 한번에 하나의 스레드만 값을 출력하고 증가시키기때문에 순서대로 출력됨
여기서 int i; // 공유자원으로 주셨는데, 어떤 역할을 하는지 설명해주실수있을까요?ㅠ