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:
댓글 달기