Forum studentów Informatyki Zaocznej na Uniwersytecie Opolskim
Żeby użyć semafora trzeba utworzyć uchwyt. Robi się to dokładnie tak jak deklaruje zmienną:
Piszemy:
HANDLE nazwa_semafora;
Aby utworzyć semafor musimy napisać:
nazwa_semafora = CreateSemaphore(NULL,4,4,NULL);
Znaczenie parametrów:
1-szy: NULL, tzn. semafor nie może być dziedziczony przez procesy potomne;
2-gi : wartość początkowa licznika ustawiona na 4;
3-ci : maksymalna wartość licznika 4 (chcemy "wpuścić" nie więcej niż 3 procesy)
4-ty : nazwa, ale ja zawsze daję NULL, bo nie za bardzo mi to działa
Trzeba zwrócić uwagę, żeby przypadkiem semafor nie został użyty zanim go utworzymy.
Używanie semafora w wątku:
Aby wątek od razu zajmował semafor trzeba w funkcji:
void __fastcall Nazwa_Watku::Execute();
od razu na początku dopisać:
WaitForSingleObject(nazwa_semafora,INFINITE);
W efekcie jeśli semafor będzie wolny to wątek od razu zacznie wykonywanie, jeśli nie, to będzie czekał na zwolnienie semafora. Dzięki naszemu semaforowi możemy wykonywać jedynie max 4 wątki na raz.
Zanim wątek skończy pracę należy zwolnić semafor poleceniem:
ReleaseSemaphore(nazwa_semafora,1,NULL);
Cyfra 1 oznacza zwiększenie licznika semafora o 1.
Trzeba pamiętać, że w miarę jak semafor jest zajmowany, jego licznik się zmniejsza. Jeśli osiągnie 0 wtedy semafor jest całkowicie zajęty.
To: WaitForSingleObject(nazwa_semafora,INFINITE); polecenie trzeba dopisać do każdego wątku którym ma się "zająć" semafor
Offline