도와주세요!!
메인프로그램에서 쓰레드를 생성하여 각각 두개의 함수를 실행합니다.
각 함수들은 뮤텍스와 조건변수를 이용하여 전역변수에 엑세스하게 되는데요.
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(..)에 신호가 가게하는 겁니다.
그런데 블럭상태가 계속되네요.
요 위의 예제에서는 아예 문자도 안찍히구요.