Wątki - Problem Zakleszczenia

0
#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ć ??

0

jeden wątek uzyskuję zupełną kontrolę nad mutexem i nie dopuszcza innych wątków do sekcji krytycznej.

Czyli wszystko działa jak należy :) W tym kodzie nie ma mowy o zakleszczeniu.

poziom++;
numer++;


To powinny być operacje atomowe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1