Semaforobjekt
Ett semaforobjekt är ett synkroniseringsobjekt som upprätthåller ett antal mellan noll och ett angivet maxvärde. Antalet minskas varje gång en tråd slutför en väntan på semaforobjektet och ökas varje gång en tråd släpper ut semaforen. När antalet når noll kan inga fler trådar vänta tills semaforobjektets tillstånd har signalerats. Tillståndet för en semafor är inställt på att signaleras när dess antal är större än noll och nonsignaled när dess antal är noll.
Semaforobjektet är användbart för att styra en delad resurs som kan stödja ett begränsat antal användare. Den fungerar som en grind som begränsar antalet trådar som delar resursen till ett angivet maximalt antal. Ett program kan till exempel begränsa antalet fönster som skapas. Den använder en semafor med ett maximalt antal som är lika med fönstergränsen, vilket minskar antalet när ett fönster skapas och ökar det när ett fönster stängs. Programmet anger semaforobjektet i anropet till någon av de väntefunktionerna innan varje fönster skapas. När antalet är noll , vilket anger att fönstergränsen har nåtts, blockerar väntefunktionen körningen av koden för att skapa fönster.
En tråd använder funktionen CreateSemaphore eller CreateSemaphoreEx för att skapa ett semaforobjekt. Den skapande tråden anger det inledande antalet och det maximala värdet för antalet för objektet. Det inledande antalet får inte vara mindre än noll eller större än det maximala värdet. Den skapande tråden kan också ange ett namn för semaforobjektet. Trådar i andra processer kan öppna ett handtag till ett befintligt semaforobjekt genom att ange dess namn i ett anrop till funktionen OpenSemaphore. Mer information om namn på mutex-, händelse-, semafor- och timerobjekt finns i Interprocess Synchronization.
Om mer än en tråd väntar på en semafor väljs en väntande tråd. Anta inte en fifo-order (first-in, first-out). Externa händelser, till exempel API:er i kernelläge, kan ändra vänteordningen.
Varje gång en av de väntefunktionerna returnerar eftersom tillståndet för en semafor har ställts in att signaleras, minskas antalet semafor med en. Funktionen ReleaseSemaphore ökar antalet semaforer med ett angivet belopp. Antalet får aldrig vara mindre än noll eller större än det maximala värdet.
Det initiala antalet semaforer anges vanligtvis till det maximala värdet. Antalet minskas sedan från den nivån när den skyddade resursen förbrukas. Du kan också skapa en semafor med ett initialt antal noll för att blockera åtkomst till den skyddade resursen medan programmet initieras. Efter initieringen kan du använda ReleaseSemaphore för att öka antalet till det maximala värdet.
En tråd som äger ett mutex-objekt kan vänta upprepade gånger på att samma mutex-objekt ska signaleras utan att dess körning blockeras. En tråd som väntar upprepade gånger på samma semaforobjekt, men minskar semaforens antal varje gång en vänteåtgärd slutförs. tråden blockeras när antalet blir noll. På samma sätt kan endast tråden som äger en mutex anropa funktionen ReleaseMutex, även om alla trådar kan använda ReleaseSemaphore för att öka antalet semaforobjekt.
En tråd kan minska antalet semaforer mer än en gång genom att upprepade gånger ange samma semaforobjekt i anrop till någon av väntefunktioner. Att anropa en av väntefunktionerna för flera objekt med en matris som innehåller flera handtag av samma semafor resulterar dock inte i flera minskningar.
När du är klar med semaforobjektet anropar du funktionen CloseHandle för att stänga handtaget. Semaforobjektet förstörs när dess sista handtag har stängts. Stängning av handtaget påverkar inte semaforantalet; Se därför till att anropa ReleaseSemaphore innan du stänger handtaget eller innan processen avslutas. Annars kommer väntande väntetidsåtgärder antingen att överskrida tidsgränsen eller fortsätta på obestämd tid, beroende på om ett timeout-värde har angetts.
Relaterade ämnen