mutex변수에 관한 궁금증
글쓴이: kyupark01 / 작성시간: 수, 2014/05/07 - 5:55오후
안녕하세요.
프로그램을 짜다가 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;
}Forums:


댓글 달기