mutex변수에 관한 궁금증

kyupark01의 이미지

안녕하세요.

프로그램을 짜다가 mutex구조체의 맴버 변수에 관해서 궁금한 점이 있어서 작성합니다.

mutex을 쓸때 pthread_mutex_t을 임의 이름으로 선언하여서(mutex로 선언)쓸 때
mutex구조체의 맴버중에 lock이라는 변수가 있는데 이 변수가 의미하는 뜻을 잘 모르겠어요

lock에 대한 변수를 출력하는 소스는 다음과 같습니다.

#include <stdio.h>  
#include <unistd.h>  
#include <pthread.h>  
int ncount;    // 쓰레드간 공유되는 자원 
static    pthread_mutex_t  mutex;
 
void* do_loop(void *data) 
{ 
    int i;  
    printf("task1  lock before : lock %d owner %u nusers %u count %u line %d\n", mutex.__data.__lock, mutex.__data.__owner, mutex.__data.__nusers, mutex.__data.__count, __LINE__);
    for (i = 0; i < 10; i++) 
    {   
        pthread_mutex_lock(&mutex); // 잠금을 생성한다. 
        printf("task 1 : %d\n", ncount); 
        printf("task1 run : lock %d owner %u nusers %u count %u line %d\n", mutex.__data.__lock, mutex.__data.__owner, mutex.__data.__nusers, mutex.__data.__count, __LINE__);
        ncount ++; 
        if(i == 10) 
        {   
            pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
            return;
        }   
        sleep(1); 
    }   
    for(i = 0; i < 10; i++)
    {   
        pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
    }   
} 
void* do_loop1(void *data) 
{ 
    int i;  
    pthread_mutex_lock(&mutex); // 잠금을 생성한다. 
    for (i = 0; i < 10; i++) 
    {   
        printf("task 2 : %d\n", ncount); 
        ncount ++; 
        if(i == 10) 
        {   
            pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
            return;
        }   
        sleep(1); 
    }   
    pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
}
 
void* do_loop2(void *data) 
{ 
    int i;
    pthread_mutex_lock(&mutex); // 잠금을 생성한다. 
    for (i = 0; i < 10; i++)
    {
        printf("task 3 : %d\n", ncount);
        ncount ++;
        if(i == 10)
        {
            pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
            return;
        }
        sleep(1);
    }
    pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
}
void* do_loop3(void *data)
{
    int i;
    pthread_mutex_lock(&mutex); // 잠금을 생성한다. 
    for (i = 0; i < 10; i++)
    {
        printf("task 4 : %d\n", ncount);
        ncount ++;
        if(i == 10)
        {
            pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
            return;
        }
        sleep(1);
    }
    pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
}
void* do_loop4(void *data)
{
    int i;
    // 잠금을 얻으려고 하지만 do_loop 에서 이미 잠금을  
    // 얻었음으로 잠금이 해제될때까지 기다린다.   
    pthread_mutex_lock(&mutex); // 잠금을 생성한다. 
    for (i = 0; i < 10; i++)
    {
        printf("task 5 : %d\n", ncount);
        ncount ++;
        sleep(1);
    }
    pthread_mutex_unlock(&mutex); // 잠금을 해제한다. 
 
}
 
int main()
{
    int       thr_id;
    int status;
    int a = 1;
 
    pthread_mutexattr_t mutexattr;
    pthread_t p_thread[5];
 
    pthread_mutexattr_init(&mutexattr);
    pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_RECURSIVE);
    pthread_mutex_init(&mutex, &mutexattr);
    pthread_mutexattr_destroy(&mutexattr);
 
 
    ncount = 0;
    thr_id = pthread_create(&p_thread[0], NULL, do_loop, (void *)&a);
    sleep(1);
    thr_id = pthread_create(&p_thread[1], NULL, do_loop1, (void *)&a);
    sleep(1);
    thr_id = pthread_create(&p_thread[2], NULL, do_loop2, (void *)&a);
    sleep(1);
    thr_id = pthread_create(&p_thread[3], NULL, do_loop3, (void *)&a);
    sleep(1);
    thr_id = pthread_create(&p_thread[4], NULL, do_loop4, (void *)&a);
    sleep(1);
 
    pthread_join(p_thread[0], (void *) &status);
    pthread_join(p_thread[1], (void *) &status);
    pthread_join(p_thread[2], (void *) &status);
    pthread_join(p_thread[3], (void *) &status);
    pthread_join(p_thread[4], (void *) &status);
 
    printf("task  lock : lock %d owner %u nusers %u count %u line %d\n", mutex.__data.__lock, mutex.__data.__owner, mutex.__data.__nusers, mutex.__data.__count, __LINE__);
    status = pthread_mutex_destroy(&mutex);
    printf("code  =  %d", status);
    printf("programing is end\n");
    return 0;
}