我有此代码:
#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
答案 0 :(得分:4)
我希望valore cont1 = 1 valore con2 = 2“
您不能从该程序中得到任何期望。您正在main
中访问一个正在一个或多个线程中修改的变量。这是一场数据竞赛,而且行为不确定。
即使您在main
中添加了互斥保护,也无法期望在打印该值之前会发生增量。线程的全部要点是它们是异步执行的。如果要同步增量,请不要使用线程。
答案 1 :(得分:1)
在调用pthread_join
之前,线程不一定运行。
到那时,您已经打印了输出。