我创建了这个程序,它包含一个线程,当值等于o小于5时,加1,当值大于5时,一个线程减1。 问题是只有一个线程工作,有时没有一个工作,我现在无法解决这个问题。
有两个全局变量:
int value=0;
pthread_mutex_t mux=PTHREAD_MUTEX_INITIALIZER;
这是sum
函数:
void* sum(void* args){
int exit;
while(1){
pthread_mutex_lock(&mux);
if(value<=5){
value=value+1;
}
printf("value: %d\n",value);
fflush(stdout);
pthread_mutex_unlock(&mux);
sleep(1);
}
pthread_exit((void*)&exit);
}
这是sub
函数:
void* sub(void* args){
int exit;
while(1){
pthread_mutex_lock(&mux);
if(value>5){
value=value-1;
}
printf("value: %d\n",value);
fflush(stdout);
sleep(1);
pthread_mutex_unlock(&mux);
}
pthread_exit((void*)&exit);
}
这是main
函数:
int main(){
pthread_t inc,dec;
int status;
if(pthread_create(&dec,NULL,sottrazione,NULL)){
printf("Sub thread can't be created\n");
exit(-1);
}
if(pthread_create(&inc,NULL,somma,NULL)){
printf("Sum thread can't be created\n");
exit(-2);
}
if(pthread_join(inc,(void*)&status) && pthread_join(dec,(void*)&status)){
printf("Join failed\n");
exit(-3);
}
return 0;
}
预期输出应为:
value: 0
value: 1
value: 2
value: 3
value: 4
value: 5
value: 6
value: 5
...
答案 0 :(得分:0)
在上面的情况中,value
是一个全局变量,当sub
被调用时,它获取锁而不解锁它。即使由于sleep
而发生线程切换,但由于在sub
和sum
线程中使用了相同的互斥变量,控制移动到sum
线程但mux
仍处于锁定状态,因此它不会进入代码的关键部分,而是返回到先前的(sub
)线程。
要避免此问题,您应该使用两个互斥变量或使用条件变量。
选项-1:
pthread_mutex_t mux1=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mux2=PTHREAD_MUTEX_INITIALIZER;
void* sum(void* args){
int exit;
while(1){
pthread_mutex_lock(&mux1);/* when it comes here, mux1 is still un-locked so it will lock & enters */
if(value<=5){
printf("value_sum: %d\n",value);
value=value+1;
}
fflush(stdout);
pthread_mutex_unlock(&mux2);
sleep(1);
}
pthread_exit((void*)&exit);
}
void* sub(void* args){
int exit;
while(1){
pthread_mutex_lock(&mux2); /* first lock the mux2 */
if(value>5){
printf("value_sub: %d\n",value);
value=value-1;
}
fflush(stdout);
sleep(1);/* because of this control moves to sum thread */
pthread_mutex_unlock(&mux1);
}
pthread_exit((void*)&exit);
}
选项2: - 使用条件变量概念。
int pthread_cond_wait(pthread_con_t *cond,pthread_mutex_t *mutex);