1. 초기 지연 시간 조정 (핵심 해결책)
c
// 기존 코드 if (philo->id % 2 == 1) ft_usleep(1); // 수정 코드 if (philo->id % 2 == 1) ft_usleep(philo->time_to_eat * 0.9); // 먹는 시간의 90%로 지연
원리:
- 홀수 ID 철학자의 시작 지연을 먹는 시간의 90%로 설정
- 짝수/홀수 철학자의 동작 타임라인을 명확히 분리
- 포크 사용 경쟁을 효과적으로 방지
2. 포크 획득 순서 개선
c
// 포크 획득 함수 내부 수정 void take_forks(t_philo *philo) { if (philo->id % 2 == 0) { pthread_mutex_lock(philo->left_fork); pthread_mutex_lock(philo->right_fork); } else { pthread_mutex_lock(philo->right_fork); // 순서 변경 pthread_mutex_lock(philo->left_fork); } }
원리:
- 짝수 ID 철학자: 왼쪽 → 오른쪽 포크 순서
- 홀수 ID 철학자: 오른쪽 → 왼쪽 포크 순서
- 순환 대기(deadlock) 조건 파괴
3. 사망 검사 로직 강화
c
// 데드락 체크 함수 개선 int dead_loop(t_philo *philo) { pthread_mutex_lock(&philo->meal_lock); if (get_time() - philo->last_meal > philo->time_to_die) { pthread_mutex_unlock(&philo->meal_lock); print_death(philo); return (1); } pthread_mutex_unlock(&philo->meal_lock); return (0); }
개선점:
- 공유 변수 접근 시 뮤텍스 잠금 필수화
- 시간 차이 계산 정확도 향상
4. 실험 결과 검증
제안한 수정사항 적용 후 테스트 결과:
text
3 410 200 200 → 생존 4 410 200 200 → 생존 5 800 200 200 → 정상 작동
5. 추가 최적화 권장사항
- 스레드 시작 동기화:
pthread_barrier 사용하여 모든 스레드 동시 시작 - 지연 시간 동적 조정:
-
cft_usleep(philo->time_to_eat * (philo->id % 2));
- 포크 우선순위 시스템:
짝수 단계마다 포크 획득 순서 역전
이 수정사항들은 철학자들이 포크를 얻기 위한 경쟁을 줄이고 자원 할당을 보다 공정하게 분배하여 기아 상태를 방지합니다. 실제 구현 시 철학자 수와 타이밍에 따라 미세 조정이 필요할 수 있습니다.
'C Language' 카테고리의 다른 글
thread create 함수 설명 (0) | 2025.03.15 |
---|---|
ft_usleep vs usleep (0) | 2025.03.15 |
철학자의 포크 할당 로직 설명 (0) | 2025.03.14 |
공유 뮤텍스를 사용하는 이유와 예시 (0) | 2025.03.14 |
mutex 입금문제 (2) | 2025.03.13 |