c

时间:2018-12-13 10:24:59

标签: c mutex

我有此代码:

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

int cont = 0;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

void* codiceThreadIncremento(void *arg)
{
    //sezione critica
    pthread_mutex_lock(&mut);
    printf("hello");
    cont++;
    pthread_mutex_unlock(&mut);

    return NULL;
}

int main(void){
    pthread_t thread1;
    pthread_t thread2;
    pthread_create(&thread1, NULL, &codiceThreadIncremento,NULL);
    printf("valore cont1 %d \n",cont);
    pthread_create(&thread2, NULL, &codiceThreadIncremento, NULL);
    printf("valore cont2 %d \n",cont);
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    pthread_mutex_destroy(&mut);
    return 0;
}

我想使用互斥锁尝试简单地递增变量“ cont”。

当我执行这段代码时,我得到了:

valore cont1 0 
valore cont2 0 

但是我希望

valore cont1= 1  
valore con2 = 2

2 个答案:

答案 0 :(得分:4)

  

我希望valore cont1 = 1 valore con2 = 2“

您不能从该程序中得到任何期望。您正在main中访问一个正在一个或多个线程中修改的变量。这是一场数据竞赛,而且行为不确定。

即使您在main中添加了互斥保护,也无法期望在打印该值之前会发生增量。线程的全部要点是它们是异步执行的。如果要同步增量,请不要使用线程。

答案 1 :(得分:1)

在调用pthread_join之前,线程不一定运行。

到那时,您已经打印了输出。