프로세스 내에서 실행되는 가장 작은 실행 단위로 독립적인 실행 흐름을 가짐
// 철학자 프로젝트에의 스레드 생성
pthread_create(&(philo[i].p_thread), NULL, ft_thread, &(philo[i]))
여러 스레드가 동시에 실행되는 환경으로 자원 공유를 통해 효율적인 작업 가능
하지만 동시성 문제 발생 가능
// 철학자 프로젝트에서의 멀티스레드
- 메인 스레드 (프로그램 제어)
- 철학자 스레드들 (각 철학자의 행동)
- 모니터링 스레드 (상태 감시)
임계 구역 보호를 위한 잠금 매커니즘
pthread_mutex_t mutex;
pthread_mutex_lock(&mutex); // 잠금
// 임계 구역
pthread_mutex_unlock(&mutex); // 해제
여러 스레드가 동시에 같은 데이터에 접근할 때 발생
예측 불가능한 결과 초래할 수 있음!
// Data Race 예시
philo->last_eat_time = ft_gettime(); // 보호되지 않은 공유 변수 접근
philo->eat_cnt++; // 보호되지 않은 공유 변수 접근
둘 이상의 스레드가 서로의 자원을 기다리며 무한 대기 자원의 순환 대기로 인한 진행 불가 상태
// Deadlock 발생 가능한 코드
pthread_mutex_lock(fork1); // 첫 번째 포크 잠금
pthread_mutex_lock(fork2); // 두 번째 포크 잠금 (이미 다른 철학자가 사용 중)
여러 스레드가 동시에 접근하면 문제가 발생할 수 있는 코드 영역
// 임계 구역 예시
pthread_mutex_lock(&philo->eat_num_event); // 임계 구역 시작
philo->last_eat_time = ft_gettime(); // 임계 구역
philo->eat_cnt++; // 임계 구역
pthread_mutex_unlock(&philo->eat_num_event); // 임계 구역 끝
- Multi Thread 환경에서 공유 자원 접근시 Data Race 발생 가능
- Data Race 방지를 위해 Critical Section 설정
- Critical Section 보호를 위해 Mutex 사용
- Mutex 사용시 잘못된 설계로 Dead Lock 발생 가능
- 적절한 Mutex 설계와 사용으로 동시성 문제 해결