본문 바로가기

C Language

pthread_mutex_lock unlock

`dead_loop` 함수는 철학자 문제(Dining Philosophers Problem)에서 철학자가 죽었는지 여부를 확인하는 함수입니다. 이 함수는 철학자의 죽음 상태(`dead_flag`)를 안전하게 검사하고, 철학자가 죽었다면 `1`을 반환하고, 그렇지 않으면 `0`을 반환합니다. 아래에서 이 함수를 상세히 설명하겠습니다.

---

### **함수의 목적**
- 철학자가 죽었는지 여부를 확인합니다.
- 철학자의 죽음 상태는 `dead_flag`라는 공유 변수로 관리됩니다.
- `dead_flag`는 여러 스레드(철학자)가 동시에 접근할 수 있으므로, 뮤텍스(`dead_lock`)를 사용하여 동기화합니다.

---

### **함수의 동작**
1. **뮤텍스 잠금**:
   - `pthread_mutex_lock(philo->dead_lock);`을 호출하여 `dead_lock` 뮤텍스를 잠급니다.
   - 이는 `dead_flag`에 대한 동시 접근을 방지합니다.

2. **죽음 상태 확인**:
   - `if (*philo->dead == 1)`을 통해 철학자의 죽음 상태를 확인합니다.
   - `dead_flag`가 `1`이면 철학자가 죽은 상태입니다.

3. **뮤텍스 잠금 해제 및 반환**:
   - 철학자가 죽었다면:
     - `pthread_mutex_unlock(philo->dead_lock);`을 호출하여 뮤텍스를 해제합니다.
     - `1`을 반환합니다.
   - 철학자가 살아있다면:
     - `pthread_mutex_unlock(philo->dead_lock);`을 호출하여 뮤텍스를 해제합니다.
     - `0`을 반환합니다.

---

### **코드 상세 설명**
```c
int dead_loop(t_philo *philo)
{
    // 1. 뮤텍스 잠금 (dead_flag에 대한 동기화)
    pthread_mutex_lock(philo->dead_lock);

    // 2. 죽음 상태 확인
    if (*philo->dead == 1)
    {
        // 3. 철학자가 죽었다면 뮤텍스 잠금 해제 후 1 반환
        pthread_mutex_unlock(philo->dead_lock);
        return (1);
    }

    // 4. 철학자가 살아있다면 뮤텍스 잠금 해제 후 0 반환
    pthread_mutex_unlock(philo->dead_lock);
    return (0);
}
```

---

### **함수의 사용 예시**
이 함수는 주로 철학자의 행동(생각, 먹기, 자기)을 시뮬레이션하는 루프에서 사용됩니다. 예를 들어:

```c
void *philosopher_routine(void *arg)
{
    t_philo *philo = (t_philo *)arg;

    while (1)
    {
        // 철학자가 죽었는지 확인
        if (dead_loop(philo) // 죽었다면 루프 종료
            break;

        // 철학자의 행동 (생각, 먹기, 자기)
    }
    return (NULL);
}
```

---

### **함수의 중요성**
1. **동기화**:
   - `dead_flag`는 여러 스레드가 공유하는 변수이므로, 뮤텍스를 사용하여 안전하게 접근해야 합니다.
   - `dead_loop` 함수는 뮤텍스를 사용하여 `dead_flag`를 안전하게 검사합니다.

2. **죽음 상태 관리**:
   - 철학자가 죽으면 `dead_flag`가 `1`로 설정되고, 모든 철학자는 이를 확인하여 프로그램을 종료합니다.
   - 이는 철학자 문제에서 교착 상태(deadlock)와 기아(starvation)를 방지하는 데 중요합니다.

3. **모듈화**:
   - `dead_loop` 함수는 죽음 상태 확인 로직을 모듈화하여 코드의 가독성과 재사용성을 높입니다.

---

### **예시 시나리오**
1. **철학자가 죽은 경우**:
   - 메인 스레드 또는 모니터링 스레드가 철학자의 `last_meal` 시간을 확인하고, `time_to_die`를 초과하면 `dead_flag`를 `1`로 설정합니다.
   - `dead_loop` 함수는 `dead_flag`가 `1`임을 확인하고 `1`을 반환합니다.
   - 철학자 스레드는 루프를 종료하고 프로그램이 종료됩니다.

2. **철학자가 살아있는 경우**:
   - `dead_loop` 함수는 `dead_flag`가 `0`임을 확인하고 `0`을 반환합니다.
   - 철학자 스레드는 계속해서 행동(생각, 먹기, 자기)을 시뮬레이션합니다.

---

### **결론**
- `dead_loop` 함수는 철학자의 죽음 상태를 안전하게 확인하는 역할을 합니다.
- 뮤텍스를 사용하여 `dead_flag`에 대한 동시 접근을 방지하고, 철학자 문제의 안정성을 보장합니다.
- 이 함수는 철학자 문제의 핵심 로직에서 중요한 역할을 합니다.

'C Language' 카테고리의 다른 글

pthread_mutex_lock pthread_mutex_unlock 설명  (0) 2025.03.12
pthread_create pthread_join 설명  (0) 2025.03.12
mutex null 속성으로 초기화 + fork  (0) 2025.03.10
mutex  (0) 2025.03.10
cpp 01  (0) 2025.03.10