pthread_mutex_t *dead_lock;과 pthread_mutex_t dead_lock;의 차이는 포인터 사용 여부입니다. 이 차이는 메모리 할당 방식, 공유 방식, 초기화 방법 등에 영향을 미칩니다. 아래에서 개념적인 차이를 설명하고 예제를 들어 비교해보겠습니다.
🔹 1. pthread_mutex_t dead_lock; (변수 자체가 뮤텍스)
typedef struct s_philo
{
pthread_mutex_t dead_lock; // 구조체 내부에 뮤텍스 변수를 직접 포함
} t_philo;
✅ 특징
- dead_lock은 t_philo 구조체의 직접적인 멤버 변수.
- 구조체가 생성될 때 뮤텍스도 함께 메모리에 할당됨.
- pthread_mutex_init(&philo->dead_lock, NULL);을 통해 초기화해야 함.
- 개별적인 뮤텍스로 동작 → 각 t_philo 인스턴스마다 독립적인 dead_lock을 가짐.
✅ 예제
#include <stdio.h>
#include <pthread.h>
typedef struct s_philo
{
pthread_mutex_t dead_lock; // 뮤텍스 변수 자체를 포함
} t_philo;
int main()
{
t_philo philo;
// 뮤텍스 초기화
pthread_mutex_init(&philo.dead_lock, NULL);
// 뮤텍스 사용 예시
pthread_mutex_lock(&philo.dead_lock);
printf("Locked\n");
pthread_mutex_unlock(&philo.dead_lock);
// 뮤텍스 제거
pthread_mutex_destroy(&philo.dead_lock);
return 0;
}
📌 중요한 점
- philo 구조체 안에 뮤텍스 자체가 들어 있음.
- philo가 생성될 때 뮤텍스도 함께 할당됨.
- 뮤텍스를 사용할 때 &philo.dead_lock처럼 참조해야 함.
🔹 2. pthread_mutex_t *dead_lock; (포인터로 뮤텍스 참조)
typedef struct s_philo
{
pthread_mutex_t *dead_lock; // 포인터로 뮤텍스를 참조
} t_philo;
✅ 특징
- dead_lock은 뮤텍스를 가리키는 포인터.
- 구조체가 생성될 때 뮤텍스 자체는 별도로 할당해야 함.
- 여러 개의 t_philo 구조체가 같은 뮤텍스를 공유할 수 있음.
- 뮤텍스를 동적 할당할 수도 있음.
✅ 예제 1: 뮤텍스를 공유하는 경우
#include <stdio.h>
#include <pthread.h>
typedef struct s_philo
{
pthread_mutex_t *dead_lock; // 포인터로 뮤텍스를 참조
} t_philo;
int main()
{
pthread_mutex_t shared_mutex; // 하나의 뮤텍스를 생성
pthread_mutex_init(&shared_mutex, NULL);
t_philo philo1, philo2;
philo1.dead_lock = &shared_mutex; // 두 철학자가 같은 뮤텍스를 사용
philo2.dead_lock = &shared_mutex;
// 뮤텍스 사용 예시
pthread_mutex_lock(philo1.dead_lock);
printf("Locked by philo1\n");
pthread_mutex_unlock(philo1.dead_lock);
pthread_mutex_destroy(&shared_mutex);
return 0;
}
📌 중요한 점
- dead_lock이 포인터이므로 외부에서 생성된 뮤텍스를 가리킬 수 있음.
- 여러 철학자가 같은 shared_mutex를 공유하면서 동기화할 수 있음.
✅ 예제 2: 뮤텍스를 동적 할당하는 경우
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
typedef struct s_philo
{
pthread_mutex_t *dead_lock;
} t_philo;
int main()
{
t_philo philo;
// 동적 할당
philo.dead_lock = malloc(sizeof(pthread_mutex_t));
pthread_mutex_init(philo.dead_lock, NULL);
// 뮤텍스 사용
pthread_mutex_lock(philo.dead_lock);
printf("Locked\n");
pthread_mutex_unlock(philo.dead_lock);
// 정리
pthread_mutex_destroy(philo.dead_lock);
free(philo.dead_lock);
return 0;
}
📌 중요한 점
- pthread_mutex_t *dead_lock;이므로 포인터에 동적 할당해야 함.
- malloc()을 사용하여 뮤텍스를 생성하고, free()로 해제해야 함.
🔹 3. 차이점 요약
구분 pthread_mutex_t dead_lock; pthread_mutex_t *dead_lock;
메모리 할당 | 구조체 내에 직접 포함됨 | 뮤텍스를 별도로 할당해야 함 |
초기화 방법 | pthread_mutex_init(&philo.dead_lock, NULL); | philo.dead_lock = malloc(sizeof(pthread_mutex_t)); pthread_mutex_init(philo.dead_lock, NULL); |
사용 방법 | pthread_mutex_lock(&philo.dead_lock); | pthread_mutex_lock(philo.dead_lock); |
공유 가능성 | 각 t_philo 인스턴스가 독립적인 뮤텍스를 가짐 | 여러 t_philo가 같은 뮤텍스를 공유할 수 있음 |
동적 할당 | ❌ 불가능 (컴파일 타임 크기 결정) | ✅ 가능 (런타임 할당) |
주 사용 사례 | 개별 객체의 동기화 | 여러 객체 간 공유 동기화 |
🔹 4. 어떤 경우에 어떤 방식을 써야 할까?
- pthread_mutex_t dead_lock;
- 각 객체(예: 철학자)가 자신만의 뮤텍스를 가지고 있어야 할 때 사용.
- 뮤텍스가 독립적으로 동작해야 할 때 유용.
- pthread_mutex_t *dead_lock;
- 여러 개의 객체가 하나의 뮤텍스를 공유해야 할 때 사용.
- 동적 할당이 필요할 때 사용.
- 메모리를 효율적으로 사용하고 싶을 때 (예: 전역적으로 하나의 뮤텍스만 유지).
🔹 결론
- 독립적인 뮤텍스가 필요하면 pthread_mutex_t dead_lock;을 사용.
- 여러 객체가 공유하는 뮤텍스를 사용하려면 pthread_mutex_t *dead_lock;을 사용.
- *dead_lock을 사용할 경우, 반드시 뮤텍스를 별도로 할당하고 해제해야 함.
🚀 즉, pthread_mutex_t *dead_lock;은 더 유연하지만, 추가적인 메모리 관리가 필요하다!
'C Language' 카테고리의 다른 글
eat 함수 (0) | 2025.03.13 |
---|---|
pthread_mutex_init NULL 초기화 (0) | 2025.03.13 |
mutex 잠금 원리 (0) | 2025.03.13 |
pthread_mutex_lock pthread_mutex_unlock 설명 (0) | 2025.03.12 |
pthread_create pthread_join 설명 (0) | 2025.03.12 |