메인프로그램에서 쓰레드를 생성하여 각각 두개의 함수를 실행합니다.

각 함수들은 뮤텍스와 조건변수를 이용하여 전역변수에 엑세스하게 되는데요.

 

void *do_write(void *data){
 int status;
 mydata.a = 0;
 mydata.b = 0;

 

 while(1){
  pthread_mutex_lock(&lockA);
  mydata.a = random()%6000;
  mydata.b = random()%6000;
  status = pthread_cond_signal(&condA);
   pthread_mutex_unlock(&lockA);
    sleep(2);
 }
}

void *do_read(void *data){
 int status;
   while(1){
  pthread_mutex_lock(&lockA);
   status = pthread_cond_wait(&condA, &lockA);
  printf("%4d + %4d = %4d \n", mydata.a, mydata.b, mydata.a + mydata.b);
  pthread_mutex_unlock(&lockA);

 }
}

-------------------------------------------------------------------------------------------------

그 함수들은 do_write , do_read 함수입니다. 위와 같은경우 do_write(스레드)에서  전역변수들을 엑세스하고 값을 변경하고나서

조건변수 condA에 시그널을 보내면  do_read함수(스레드)에서 전역변수들을 엑세스해서 출력합니다.

문제없이 잘 돌아가는데요.

 

do_read에서 값확인을 했다는것을 do_write에게 보내고 do_write는 그것을 확인하는 소스를 추가해 봤습니다.

 

----------------------------------------------------------------------------------------------------

void *do_write(void *data){
 int status;
 mydata.a = 0;
 mydata.b = 0;
 printf("1");
  pthread_mutex_lock(&lockA);
  mydata.a = random()%6000;
  mydata.b = random()%6000;
  printf("2");
  status = pthread_cond_signal(&condA);
  printf("3");
  pthread_mutex_unlock(&lockA);
 printf("4");  
   sleep(2);
    while(1){
  pthread_mutex_lock(&lockB);
     status = pthread_cond_wait(&condB, &lockB);   
  pthread_mutex_unlock(&lockB);
        if(status == 0){
            do_write(data);
  }
 }
}

void *do_read(void *data){
 int status;
 
  pthread_mutex_lock(&lockA);
  printf("wait");
  status = pthread_cond_wait(&condA, &lockA);
  printf("%4d + %4d = %4d \n", mydata.a, mydata.b, mydata.a + mydata.b);
  pthread_mutex_unlock(&lockA);
    while(1){
  pthread_mutex_lock(&lockB);
     status = pthread_cond_signal(&condB);   
  pthread_mutex_unlock(&lockB);

 }
}

----------------------------------------------------------------------------------------------------------

 

확인을 위해 별도의 조건변수와 뮤텍스를 생성했습니다.

그런데 실행해보면 아무문자도 찍히지 않고 블럭된 상태입니다.

 

아래와 같이 단순한 코드로 실행해도 마찬가짖구요.

-----------------------------------------------------------------------------------------------------------

 

void *do_write(void *data){
 int status;
 mydata.a = 0;
 mydata.b = 0;
 

 while(1){

  pthread_mutex_lock(&lockA);
  mydata.a = random()%6000;
  mydata.b = random()%6000;
   status = pthread_cond_signal(&condA);
  pthread_mutex_unlock(&lockA);

   sleep(2);

  pthread_mutex_lock(&lockB);
     status = pthread_cond_wait(&condB, &lockB);   
  pthread_mutex_unlock(&lockB);
   }
}

 

 

void *do_read(void *data){
 int status;
 

while(1){
  pthread_mutex_lock(&lockA);
  status = pthread_cond_wait(&condA, &lockA);
  printf("%4d + %4d = %4d \n", mydata.a, mydata.b, mydata.a + mydata.b);

 status = pthread_cond_signal(&condB);   
  pthread_mutex_unlock(&lockA);

 

 }
}

--------------------------------------------------------------------------------------------------------------------------------------

 

이해가 안가는게.. do_write에서 lockA를 풀어주고 다시 lockB를 락하는데요.

그럼 do_read에서 풀려진(lockA)의 자원을 엑세스하고나서  condB에 시그널을 보내면

do_write에서 lockB의 영역에 있는 pthread_cond_wait(..)에 신호가 가게하는 겁니다.

그런데 블럭상태가 계속되네요.

 

요 위의 예제에서는 아예 문자도 안찍히구요.