Semaphore – objekty
Objekt semaphore je objekt synchronizace, který udržuje počet mezi nulou a zadanou maximální hodnotou. Počet se sníží pokaždé, když vlákno dokončí čekání na objekt semaphore a zvýší se pokaždé, když vlákno uvolní semaphore. Když počet dosáhne nuly, žádné další vlákna nemohou úspěšně počkat, až se stav objektu semaforu signalizují. Stav semaforu je nastaven tak, aby signalizoval, když je jeho počet větší než nula a nepřiřazeno, pokud je jeho počet nula.
Objekt semaphore je užitečný při řízení sdíleného prostředku, který může podporovat omezený počet uživatelů. Funguje jako brána, která omezuje počet vláken sdílejících prostředek na zadaný maximální počet. Aplikace může například omezit počet oken, která vytvoří. Používá semafor s maximálním počtem, který se rovná limitu okna, a dekrementuje počet při každém vytvoření okna a jeho zvýšení při každém zavření okna. Aplikace určuje objekt semaphore ve volání jedné z čekací funkce před vytvořením každého okna. Pokud je počet nula , což znamená, že bylo dosaženo limitu okna, funkce čekání blokuje provádění kódu pro vytvoření okna.
Vlákno používá funkci CreateSemaphore nebo CreateSemaphoreEx k vytvoření objektu semaphore. Vlákno pro vytváření určuje počáteční počet a maximální hodnotu počtu objektu. Počáteční počet nesmí být menší než nula ani větší než maximální hodnota. Vlákno pro vytváření může také zadat název objektu semaphore. Vlákna v jiných procesech mohou otevřít popisovač existujícího objektu semaphore zadáním jeho názvu ve volání OpenSemaphore funkce. Další informace o názvech objektů mutex, event, semaphore a časovače naleznete v tématu Synchronizace interprocesů.
Pokud na semaphore čeká více než jedno vlákno, vybere se čekající vlákno. Nepředpokládejte pořadí fiFO (first-in). Externí události, jako jsou apcs v režimu jádra, můžou změnit pořadí čekání.
Pokaždé, když se jedna z funkce čekání vrátí, protože stav semaforu byl nastaven tak, aby signalizoval, počet semaforu se sníží o jeden. Funkce ReleaseSemaphore zvyšuje počet semaphore o zadanou částku. Počet nesmí být nikdy menší než nula nebo větší než maximální hodnota.
Počáteční počet semaphore je obvykle nastaven na maximální hodnotu. Počet se pak z této úrovně sníží, protože se spotřebuje chráněný prostředek. Alternativně můžete vytvořit semaphore s počátečním počtem nuly, abyste během inicializace aplikace zablokovali přístup k chráněnému prostředku. Po inicializaci můžete pomocí ReleaseSemaphore zvýšit počet na maximální hodnotu.
Vlákno, které vlastní objekt mutex, může čekat opakovaně na to, aby se stejný objekt mutex signalizoval, aniž by se jeho spuštění zablokoval. Vlákno, které opakovaně čeká na stejný objekt semaphore, ale sníží počet semaphore při každém dokončení operace čekání; vlákno je blokováno, když se počet dostane na nulu. Podobně pouze vlákno, které vlastní mutex může úspěšně volat funkci ReleaseMutex, i když jakékoli vlákno může použít ReleaseSemaphore ke zvýšení počtu objektu semaphore.
Vlákno může dekrementovat počet semaphore více než jednou opakovaným zadáním stejného objektu semaphore ve volání některé z wait funkcí. Volání jedné z funkcí čekání více objektů s polem, které obsahuje více popisovačů stejného semaphore, ale nemá za následek několik dekrementů.
Po dokončení použití objektu semaphore zavolejte CloseHandle funkci zavřít popisovač. Objekt semaphore je zničen při ukončení posledního popisovače. Zavření popisovače nemá vliv na počet semaphore; proto nezapomeňte volat ReleaseSemaphore před zavřením popisovače nebo před ukončením procesu. Jinak čekající operace čekání buď vyprší časový limit, nebo budou pokračovat po neomezenou dobu v závislosti na tom, jestli byla zadána hodnota časového limitu.
Související témata