Sdílet prostřednictvím


Semafor a SemaphoreSlim

Třída System.Threading.Semaphore představuje pojmenovanou (systemwide) nebo místní semaphore. Jedná se o tenký obálka kolem objektu semaforu Win32. Win32 semaphores počítá semafory, které lze použít k řízení přístupu k fondu prostředků.

Třída SemaphoreSlim představuje jednoduchý, rychlý semaphore, který lze použít pro čekání v rámci jednoho procesu, když se očekává, že doby čekání budou velmi krátké. SemaphoreSlim spoléhá co nejvíce na primitivy synchronizace poskytované modulem CLR (Common Language Runtime). Poskytuje však také lazily inicializované obslužné rutiny čekání založené na jádru podle potřeby, aby podporovaly čekání na více semaforech. SemaphoreSlim podporuje také použití tokenů zrušení, ale nepodporuje pojmenované semaphores nebo použití čekacího úchytu pro synchronizaci.

Správa omezeného prostředku

Vlákna zadávají semaphore voláním WaitOne metody, která je zděděna z WaitHandle třídy, v případě System.Threading.Semaphore objektu SemaphoreSlim.Wait nebo metody SemaphoreSlim.WaitAsync , v případě objektu SemaphoreSlim . Když se volání vrátí, počet semaforu se sníží. Když vlákno požaduje položku a počet je nula, vlákno blokuje. Když vlákna uvolní semaphore voláním Semaphore.Release nebo SemaphoreSlim.Release metodou, blokované vlákna mohou vstoupit. Neexistuje žádné zaručené pořadí, jako je například first-in, first-out (FIFO) nebo poslední in ( LIFO), pro blokovaná vlákna pro zadání semaforu.

Vlákno může několikrát zadat semaphore voláním System.Threading.Semaphore metody objektu WaitOne nebo metody objektu SemaphoreSlimWait opakovaně. Chcete-li uvolnit semaphore, vlákno může buď zavolat Semaphore.Release() nebo SemaphoreSlim.Release() metodu přetížení stejného počtu, nebo volat Semaphore.Release(Int32) přetížení metody nebo SemaphoreSlim.Release(Int32) přetížení metody a určit počet položek, které mají být uvolněny.

Semaphores a identita vlákna

Dva typy semaphore nevynucují identitu vlákna při volání WaitOne, Wait, Releasea SemaphoreSlim.Release metody. Například běžný scénář použití pro semaphores zahrnuje vlákno producenta a vlákno příjemce, přičemž jedno vlákno vždy zvýší počet semaphore a druhý vždy dekrementuje.

Je zodpovědností programátora, aby se zajistilo, že vlákno nevyvolá semafor příliš mnohokrát. Předpokládejme například, že semafor má maximální počet dvou a že vlákno A a vlákno B oba zadávají semafor. Pokud programovací chyba ve vlákně B způsobí, že se volá Release dvakrát, obě volání proběhnou úspěšně. Počet semaforů je plný a když vlákno A nakonec zavolá Release, vyvolá SemaphoreFullException se.

Pojmenované Semaphores

Operační systém Windows umožňuje, aby mapové dokumentace měly názvy. Pojmenovaný semaphore je široký systém. To znamená, že po vytvoření pojmenované semaphore je viditelné pro všechna vlákna ve všech procesech. Proto lze pojmenované semaphore použít k synchronizaci aktivit procesů i vláken.

Můžete vytvořit Semaphore objekt, který představuje pojmenovaný systémový semaphore pomocí jednoho z konstruktorů, který určuje název.

Poznámka:

Vzhledem k tomu, že pojmenované semaphores jsou široké systému, je možné mít více Semaphore objektů, které představují stejný pojmenovaný semaphore. Při každém volání konstruktoru Semaphore.OpenExisting nebo metody se vytvoří nový Semaphore objekt. Zadání stejného názvu opakovaně vytvoří více objektů, které představují stejný pojmenovaný semaphore.

Při použití pojmenovaných semaforů buďte opatrní. Vzhledem k tomu, že jsou v celém systému, může jiný proces, který používá stejný název, zadat váš semafor neočekávaně. Škodlivý kód spuštěný na stejném počítači by ho mohl použít jako základ útoku na dostupnost služby.

Zabezpečení řízení přístupu použijte k ochraně objektu Semaphore , který představuje pojmenovaný semaphore, nejlépe pomocí konstruktoru, který určuje System.Security.AccessControl.SemaphoreSecurity objekt. Zabezpečení řízení přístupu můžete použít také pomocí Semaphore.SetAccessControl této metody, ale mezi časem vytvoření semaforu a časem, kdy je chráněn, ponechá okno ohrožení zabezpečení. Ochrana semaforů pomocí zabezpečení řízení přístupu pomáhá zabránit škodlivým útokům, ale nevyřeší problém neúmyslných kolizí názvů.

Viz také