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;
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.