Мьютекс и нить в с - PullRequest
       12

Мьютекс и нить в с

0 голосов
/ 13 декабря 2018

У меня есть этот код:

#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 голосов
/ 13 декабря 2018

Я ожидаю valore cont1 = 1 valore con2 = 2 "

Вы не можете ожидать ничего от этой программы. Вы получаете доступ к переменной в main, пока она изменяется в одном илибольше потоков. Это гонка данных и неопределенное поведение.

Даже если вы добавите защиту мьютекса в main, вы не можете ожидать, что приращение произойдет до того, как вы напечатаете значение. Весь смысл потоков заключается в том, что онивыполняются асинхронно. Если вам нужны синхронные приращения, не используйте потоки.

0 голосов
/ 13 декабря 2018

Потоки не обязательно запускаются, пока вы не вызовете pthread_join.

. К тому времени вы уже напечатали вывод.

...