본문 바로가기

C Language

뮤텍스 포인터 차이

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