멀티스레딩

MELIES·2025년 2월 23일

철학자 기반으로 설명하는 멀티 스레딩~

Thread (스레드)

프로세스 내에서 실행되는 가장 작은 실행 단위로 독립적인 실행 흐름을 가짐

  • 같은 프로세스 내의 다른 스레드와 메모리 공유
// 철학자 프로젝트에의 스레드 생성
pthread_create(&(philo[i].p_thread), NULL, ft_thread, &(philo[i]))

Multi Thread (멀티 스레드)

여러 스레드가 동시에 실행되는 환경으로 자원 공유를 통해 효율적인 작업 가능
하지만 동시성 문제 발생 가능

// 철학자 프로젝트에서의 멀티스레드
- 메인 스레드 (프로그램 제어)
- 철학자 스레드들 (각 철학자의 행동)
- 모니터링 스레드 (상태 감시)

Mutex (상호 배제)

임계 구역 보호를 위한 잠금 매커니즘

  • 공유 자원에 대한 접근을 동기화
  • 한 번에 하나의 스레드만 접근 허용
pthread_mutex_t mutex;
pthread_mutex_lock(&mutex);     // 잠금
// 임계 구역
pthread_mutex_unlock(&mutex);   // 해제

Data Race (데이터 레이스)

여러 스레드가 동시에 같은 데이터에 접근할 때 발생
예측 불가능한 결과 초래할 수 있음!

// Data Race 예시
philo->last_eat_time = ft_gettime();  // 보호되지 않은 공유 변수 접근
philo->eat_cnt++;                     // 보호되지 않은 공유 변수 접근

Dead Lock (교착 상태)

둘 이상의 스레드가 서로의 자원을 기다리며 무한 대기 자원의 순환 대기로 인한 진행 불가 상태

// Deadlock 발생 가능한 코드
pthread_mutex_lock(fork1);    // 첫 번째 포크 잠금
pthread_mutex_lock(fork2);    // 두 번째 포크 잠금 (이미 다른 철학자가 사용 중)

Critical Section (임계 구역)

여러 스레드가 동시에 접근하면 문제가 발생할 수 있는 코드 영역

  • Mutex 등을 통해 보호 필요
// 임계 구역 예시
pthread_mutex_lock(&philo->eat_num_event);    // 임계 구역 시작
philo->last_eat_time = ft_gettime();          // 임계 구역
philo->eat_cnt++;                             // 임계 구역
pthread_mutex_unlock(&philo->eat_num_event);  // 임계 구역 끝

  1. Multi Thread 환경에서 공유 자원 접근시 Data Race 발생 가능
  2. Data Race 방지를 위해 Critical Section 설정
  3. Critical Section 보호를 위해 Mutex 사용
  4. Mutex 사용시 잘못된 설계로 Dead Lock 발생 가능
  5. 적절한 Mutex 설계와 사용으로 동시성 문제 해결

철학자 식사 문제에서는 이러한 개념들이 모두 실제로 구현되어 있으며, 아래와 같이 동시성 문제를 해결했다.
  • 포크(공유 자원)에 대한 접근을 Mutex로 보호
  • 식사 상태 업데이트를 Critical Section으로 관리
  • Dead Lock 방지를 위한 포크 획득 전략 구현
  • Data Race 방지를 위한 적절한 Mutex 사용
profile
42 Seoul

0개의 댓글