c语言中的互斥和线程

c语言中的互斥和线程,c,mutex,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) { //sezi

我有以下代码:

#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;
}
但我想

valore cont1= 1  
valore con2 = 2

在调用
pthread\u join
之前,线程不一定运行

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

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

您不能对此程序有任何期望。您正在访问
main
中的变量,而该变量正在一个或多个线程中修改。这是一种数据争用和未定义的行为


即使您在
main
中添加了互斥保护,也不能期望在打印值之前发生增量。线程的关键在于它们是异步执行的。如果您想要同步增量,就不要使用线程。

您确定吗?我想它们会在pthread\u create线程上运行,但不能保证是c直到pthread\u join调用之后才完成。@Flau从主线程的角度来看,子线程在创建线程的
pthread\u create()
调用开始到
pthread\u join()调用开始之间的任何时间运行
获取线程返回。在执行reaping
pthread\u join()
调用之前,子线程的运行计划可能不会少很多,并且它可能会在
pthread\u create()之前运行到完成
创建它的调用将返回。或介于两者之间的任何内容。@AndrewHenle谢谢,这是我的意思,但表达得更准确。请尝试
printf(“hello\n”);
并在加入线程后移动
printf(“valore cont2%d\n”,cont);
。@AlexanderDmitriev很棒!!!谢谢:-)
valore cont1= 1  
valore con2 = 2