Witam. Zgodnie z radą założyłem nowy wątek. Napisałem program, który w założeniu ma działać zgodnie z algorytmem piekarnianym. Pojawił się jednak pewien problem, którego przyczyny nie jestem w stanie odnaleźć. Końcowa wartość zmiennej globalnej powinna być równa sumie przejść wszystkich wątków do sekcji krytycznej. Tymczasem, zamiast wartości np. 15 (dla 3 wątków), otrzymuję wartość 10 lub 11. Co może być nie tak?
Dołączam także fragment kodu, w którym znajduje się błąd:
#include "func.h"
void gotoxy(unsigned x, unsigned y) //nie kasuje zawartości wiersza, w którym zamierza pisać
{
printf("\033[%d;%dH", y, x);
}
void* algorytm(void* arg)
{
long thread=(long)arg;
srand(time(NULL));
for(int i=0; i<LOOP; ++i)
{
int tm=(rand()%MAX_SL)+MIN_SL; //czas uśpienia
int temp=0;
choosing[thread]=true;
for(int j=0; j<tms; ++j)
{
number[j]>temp ? number[j] : temp;
}
number[thread]=temp+1;
choosing[thread]=false;
for(int other=0; other<tms; ++other)
{
while(choosing[other]) {};
while(number[other]!=0 && (number[other]<number[thread] || (number[other]==number[thread] && other<thread))) {};
}
sleep(tm); //uśpienie
gotoxy(POZ_C, (++poz_b_kryt)); //prawa strona - sekcja krytyczna
printf("S. kr. w.: %ld po raz: %d", thread, i+1); //komunikat sekcji krytycznej
fflush(stdout);
int counter=zmienna_globalna; //przypisanie prywatnemu licznikowi wartości zmiennej globalnej
++counter; //preinkrementacja licznika
sleep(SLV); //uśpienie przed zapisem
zmienna_globalna=counter; //przypisanie zmiennej globalnej wartości licznika
number[thread]=0;
gotoxy(POZ_A, (++poz_b_priv)); //lewa strona - sekcja prywatna
printf("S. pr. w.: %ld po raz: %d |", thread, i+1); //komunikat sekcji prywatnej
fflush(stdout);
}
return NULL; //funkcja zwraca wskaźnik
}