Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ett objekt i klassen CSemaphore representerar en "semafor". En semafor är ett synkroniseringsobjekt som styr åtkomsten till delade resurser och förhindrar konkurrensvillkor.
Syntax
class CSemaphore : public CSyncObject
Medlemmar
Offentliga konstruktorer
| Namn | Beskrivning |
|---|---|
CSemaphore::CSemaphore |
Konstruerar ett CSemaphore objekt. |
Anmärkningar
Semaforer är användbara för att styra åtkomsten till en delad resurs som bara kan stödja ett begränsat antal användare. Det aktuella antalet CSemaphore objekt är antalet andra användare som tillåts. När antalet når noll infogas alla försök att använda den resurs som styrs av CSemaphore objektet i en systemkö och väntar tills tidsgränsen har uppnåtts eller så ökar antalet över 0. Det maximala antalet användare som kan komma åt den kontrollerade resursen samtidigt anges under konstruktionen CSemaphore av objektet.
Om du vill använda ett CSemaphore objekt skapar du objektet CSemaphore när det behövs. Ange namnet på den semafor som du vill vänta på och att programmet ska äga det från början. Du kan sedan komma åt semaforen när konstruktorn returnerar. Anropa CSyncObject::Unlock när du är klar med åtkomsten till den kontrollerade resursen.
En alternativ metod för att använda CSemaphore objekt är att lägga till en variabel av typen CSemaphore som en datamedlem i den klass som du vill styra. Under konstruktionen av det kontrollerade objektet anropar du konstruktorn för CSemaphore datamedlemmen som anger det första åtkomstantalet, maximalt antal åtkomst, namnet på semaforen (om det används över processgränser) och önskade säkerhetsattribut.
Om du vill komma åt resurser som styrs av CSemaphore objekt på det här sättet skapar du först en variabel av typen CSingleLock eller skriver CMultiLock i resursens åtkomstmedlemsfunktion. Anropa sedan låsobjektets Lock medlemsfunktion (till exempel CSingleLock::Lock). I det här läget får tråden antingen åtkomst till resursen, väntar tills resursen har släppts och får åtkomst eller väntar på att resursen ska släppas och överskrider tidsgränsen, vilket inte ger åtkomst till resursen. I vilket fall som helst nås resursen på ett trådsäkert sätt. Om du vill frigöra resursen använder du låsobjektets Unlock medlemsfunktion (till exempel CSingleLock::Unlock) eller låter låsobjektet falla utanför omfånget.
Du kan också skapa ett CSemaphore fristående objekt och komma åt det explicit innan du försöker komma åt den kontrollerade resursen. Den här metoden, även om den är tydligare för någon som läser källkoden, är mer felbenägen.
Mer information om hur du använder CSemaphore objekt finns i artikeln Multithreading: How to Use the Synchronization Classes (Så här använder du synkroniseringsklasserna).
Arvshierarki
CSemaphore
Kravspecifikation
Rubrik: afxmt.h
CSemafor::CSemafor
Konstruerar ett namngivet eller namnlöst CSemaphore objekt.
CSemaphore(
LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL);
Parameterar
lInitialCount
Det initiala användningsantalet för semaforen. Måste vara större än eller lika med 0 och mindre än eller lika med lMaxCount.
lMaxCount
Det maximala användningsantalet för semaforen. Måste vara större än 0.
pstrName
Namnet på semaforen. Måste anges om semaforen nås över processgränser. Om NULLkommer objektet att vara namnlöst. Om namnet matchar en befintlig semafor skapar konstruktorn ett nytt CSemaphore objekt som refererar till semaforen för det namnet. Om namnet matchar ett befintligt synkroniseringsobjekt som inte är en semafor misslyckas konstruktionen.
lpsaAttributes
Säkerhetsattribut för semaforobjektet. En fullständig beskrivning av den här strukturen finns i SECURITY_ATTRIBUTES i Windows SDK.
Anmärkningar
Om du vill komma åt eller släppa ett CSemaphore objekt skapar du ett CMultiLock eller CSingleLock ett objekt och anropar dess Lock och Lås upp medlemsfunktioner.
Viktigt!
När du CSemaphore har skapat objektet använder du GetLastError för att säkerställa att mutex inte redan fanns. Om mutexen fanns oväntat kan det tyda på att en oseriös process sitter på huk och kanske har för avsikt att använda mutexen på ett skadligt sätt. I det här fallet är den rekommenderade säkerhetsmedvetna proceduren att stänga handtaget och fortsätta som om det uppstod ett fel när objektet skapades.