Ho un problema con un piccolo programmino (codice).
Il programma semplicemente crea due thread che incrementano la variabile globale contatore.
Ogni thread dovrebbe, in mutua esclusione, incrementare la variabile 50.000 volte, e il valore finale della variabile dovrebbe quindi essere infine 100.000 ...
La mutua esclusione sembra essere correttamente realizzata tramite le variabili t1vuolescrivere e t2vuolescrivere... In pratica ognuno dei thread dice che vuole scrivere (ovvero vuole incrementare la variabile), controlla che l'altro thread non voglia scrivere, se l'altro vuole scrivere aspetta per un breve periodo prima di riprovare, altrimenti scrive...
Ho provato il codice su un dual-core e su un mono-processore e la situazione è ancora più grave nel secondo...
Nel primo l'errore si presenta una trentina di volte su 100.000, nel secondo siamo sull'ordine delle 20.000 ...
Sapete aiutarmi a capire dove sta il problema?
codice:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
int contatore=0;
int t1vuolescrivere=0;
int t2vuolescrivere=0;
void* incrementa1(void* niente) {
int i;
for (i=0; i<50000; ++i) {
t1vuolescrivere=1;
while (t2vuolescrivere) {
t1vuolescrivere=0;
sleep(0.01);
t1vuolescrivere=1;
}
contatore++; // sezione critica
t1vuolescrivere=0;
}
}
void* incrementa2(void* niente) {
int i;
for (i=0; i<50000; ++i) {
t2vuolescrivere=1;
while (t1vuolescrivere) {
t2vuolescrivere=0;
sleep(0.01);
t2vuolescrivere=1;
}
contatore++; // sezione critica
t2vuolescrivere=0;
}
}
int main() {
pthread_t t1;
pthread_t t2;
pthread_create(&t1,NULL,&incrementa1,NULL);
pthread_create(&t2,NULL,&incrementa2,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
printf("Valore finale del contatore: %d\n",contatore);
return 0;
}