#define _REENTRANT
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int licznik1; // Zmienna globalna Licznik
licznik1 = 0;
int poziom = 10;
int numer = 0;
pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER; // Inicjalizowanie mutexu
void* operacja();
//Inny odpowiednik ////
//pthread_mutex_t myMutex;
//pthread_mutex_init(&myMutex , NULL);
int main()
{
pthread_t pthreadID[5]; // 5- Bo chcemy mieć 5 wątków
static int arg; // 4 argument pthread_creat KONIECZNIE typu static !!
for (int i = 0; i < 5; i++) // Pętla tworząca 5 nowych watków
{
arg = i; // Musimy przekazać kilka argumentów (5)
int test;
test = pthread_create(&pthreadID[i], NULL, operacja, (void*)&arg);
if (test != 0) {
perror("Błąd funkcji pthread_create !!!!!!");
exit(1);
}
}
for (int k = 0; k < 5; k++) // Pętla dołączająca wątki (Nakazujemy czekanie na wątki które zostały stworzone przez pthread_create !!! )
{
pthread_join(pthreadID[k], NULL); // NULL - Domyślność
}
printf("LICZNIK GLOBALNY WYNOSI %d ", licznik1);
return 0;
}
void* operacja()
{
poziom++;
poziom++;
numer++;
int przesun_1 = 5;
int przesun_2 = 40;
int licznik2; // Zmienna lokalna dla danego watku
licznik2 = licznik1;
licznik2++;
for (int i = 0; i < 5; i++) // zapetlanie
{
fflush(stdout);
licznik2 = licznik1;
licznik2++;
printf("\033[%d;%dH ", poziom, przesun_1);
printf("\033[32m \033[%d;%dH Wątek %d, %d Poza Sekcją krytyczna ", poziom, przesun_1, numer, i);
printf("\033[0m");
pthread_mutex_lock(&myMutex);
sleep(1);
printf("\033[%d;%dH ", poziom, przesun_1);
printf("\033[31m \033[%d;%dH Wątek %d, %d W Sekcji krytycznej ", poziom, przesun_2, numer, i);
pthread_mutex_unlock(&myMutex);
sleep(1);
}
return 0;
}
W lewej czesci terminalu powinniśmy widzieć cztery w pieciu watków po za sekcja krytyczna . Po prawej powinnismy widzieć ostatnio piaty watek w sekcji krytycznej.
Niestety dochodzi do zakleszczenia, jeden wątek uzyskuję zupełną kontrolę nad mutexem i nie dopuszcza innych wątków do sekcji krytycznej. Co powinienem poprawić ??