본문 바로가기

C Language

포크락 수정

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. 추가 최적화 권장사항

  1. 스레드 시작 동기화:
    pthread_barrier 사용하여 모든 스레드 동시 시작
  2. 지연 시간 동적 조정:
  3.  
    c
    ft_usleep(philo->time_to_eat * (philo->id % 2));
  4. 포크 우선순위 시스템:
    짝수 단계마다 포크 획득 순서 역전

이 수정사항들은 철학자들이 포크를 얻기 위한 경쟁을 줄이고 자원 할당을 보다 공정하게 분배하여 기아 상태를 방지합니다. 실제 구현 시 철학자 수와 타이밍에 따라 미세 조정이 필요할 수 있습니다.


 

'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