为什么只有一个线程有效?

时间:2018-02-15 15:22:37

标签: c multithreading

我创建了这个程序,它包含一个线程,当值等于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
...

1 个答案:

答案 0 :(得分:0)

在上面的情况中,value是一个全局变量,当sub被调用时,它获取锁而不解锁它。即使由于sleep而发生线程切换,但由于在subsum线程中使用了相同的互斥变量,控制移动到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);