Delen via


Semaphore-objecten

Een semaphore-object is een synchronisatieobject dat een telling tussen nul en een opgegeven maximumwaarde onderhoudt. Het aantal wordt afgebroken telkens wanneer een thread een wachttijd voor het object van de semafore voltooit en steeds wordt verhoogd wanneer een thread de semafore vrijgeeft. Wanneer het aantal nul bereikt, kunnen er geen threads meer worden gewacht totdat de status van het semafore-object wordt gesignaleerd. De toestand van een semafore wordt ingesteld op gesignaleerd wanneer het aantal groter is dan nul en niet-ondertekend wanneer het aantal nul is.

Het semaphore-object is handig bij het beheren van een gedeelde resource die een beperkt aantal gebruikers kan ondersteunen. Het fungeert als een poort die het aantal threads dat de resource deelt, beperkt tot een opgegeven maximumaantal. Een toepassing kan bijvoorbeeld een limiet brengen voor het aantal vensters dat wordt gemaakt. Er wordt een semaphore gebruikt met een maximumaantal dat gelijk is aan de vensterlimiet, waardoor het aantal wordt afgebroken wanneer een venster wordt gemaakt en wordt verhoogd wanneer een venster wordt gesloten. De toepassing geeft hetemafore-object op dat wordt aangeroepen naar een van de wachtfuncties voordat elk venster wordt gemaakt. Wanneer het aantal nul is, waarmee wordt aangegeven dat de vensterlimiet is bereikt, blokkeert de wachtfunctie de uitvoering van de code voor het maken van vensters.

Een thread maakt gebruik van de functie CreateSemaphore of CreateSemaphoreEx om een semaphore-object te maken. De makende thread geeft het initiële aantal en de maximumwaarde van het aantal voor het object op. Het aanvankelijke aantal mag niet kleiner dan nul of groter zijn dan de maximumwaarde. De thread die wordt gemaakt, kan ook een naam opgeven voor het semaphore-object. Threads in andere processen kunnen een ingang openen voor een bestaand semaphore-object door de naam ervan op te geven in een aanroep naar de OpenSemaphore functie. Zie interprocessynchronisatievoor meer informatie over namen voor mutex-, gebeurtenis-, semafore- en timerobjecten.

Als meer dan één thread op een semaphore wacht, wordt een wachtthread geselecteerd. Ga niet uit van een FIFO-volgorde (first-in, first-out). Externe gebeurtenissen, zoals kernelmodus-API's, kunnen de wachtvolgorde wijzigen.

Telkens wanneer een van de wachtfuncties retourneert omdat de toestand van een semafore is ingesteld op gesignaleerd, wordt het aantal semafore met één afgenomen. De ReleaseSemaphore functie verhoogt het aantal van een semafore met een opgegeven hoeveelheid. Het aantal mag nooit kleiner zijn dan nul of groter zijn dan de maximumwaarde.

Het aanvankelijke aantal van eenemafore wordt meestal ingesteld op de maximumwaarde. Het aantal wordt vervolgens afgetrokken van dat niveau wanneer de beveiligde resource wordt verbruikt. U kunt ook een semaphore maken met een initiële telling van nul om de toegang tot de beveiligde resource te blokkeren terwijl de toepassing wordt geïnitialiseerd. Na de initialisatie kunt u ReleaseSemaphore gebruiken om het aantal te verhogen naar de maximumwaarde.

Een thread die eigenaar is van een mutex-object kan herhaaldelijk wachten tot hetzelfde mutex-object wordt gesignaleerd zonder dat de uitvoering wordt geblokkeerd. Een thread die herhaaldelijk wacht op hetzelfde semaphore-object, wordt echter de telling van de semaphore afgebouwd telkens wanneer een wachtbewerking wordt voltooid; de thread wordt geblokkeerd wanneer het aantal nul wordt. Op dezelfde manier kan alleen de thread die eigenaar is van een mutex de functie ReleaseMutex aanroepen, hoewel elke thread ReleaseSemaphore- kan gebruiken om het aantal semaphore-objecten te verhogen.

Een thread kan het aantal van een semaphore meer dan één keer verlagen door herhaaldelijk hetzelfde semaphore-object op te geven in aanroepen naar een van de wachtfuncties. Het aanroepen van een van de wachtfuncties met meerdere objecten met een matrix die meerdere ingangen van dezelfde semafore bevat, leidt echter niet tot meerdere afwijkingen.

Wanneer u klaar bent met het gebruik van het object semaphore, roept u de functie CloseHandle aan om de ingang te sluiten. Het semaphore-object wordt vernietigd wanneer de laatste handgreep is gesloten. Het sluiten van de greep heeft geen invloed op het aantal semaforen; Zorg er daarom voor dat u ReleaseSemaphore aanroept voordat u de ingang sluit of voordat het proces wordt beëindigd. Anders treedt er een time-out op of worden wachtbewerkingen voor onbepaalde tijd voortgezet, afhankelijk van of er een time-outwaarde is opgegeven.

Semaphore-objecten gebruiken