Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Třída System.Threading.Semaphore představuje pojmenovaný (systémový) nebo místní semafor. Je to tenká obálka okolo Win32 objektu semaforu. Win32 semafory jsou počítací semafory, které řídí přístup 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 krátké. Během fáze spin-wait se procesor aktivně točí – není nečinný. Jak krátká musí být "krátká" závisí na povaze čekání: Pokud vlákna soupeří o prostředky procesoru, rotující vlákno zabírá čas procesoru, takže čekání by mělo být velmi krátké a měří se v mikrosekundách. Pokud je čekání na prostředek, který není vázán na procesor (například vstupně-výstupní operace), režie spin-waitu je méně důležitá a přijatelné čekání může být o něco delší, měřeno v milisekundách. Pokud jsou doby čekání nepředvídatelné nebo se očekává, že budou významné, použijte System.Threading.Semaphore místo toho, který se neotáčí. SemaphoreSlim spoléhá co nejvíce na primitivy synchronizace poskytované modulem CLR (Common Language Runtime). Poskytuje však také líně inicializované čekací mechanismy na bázi jádra, které podle potřeby podporují čekání na více semaforů. SemaphoreSlim podporuje také použití tokenů zrušení, ale nepodporuje pojmenované semafory ani použití čekacího objektu pro synchronizaci.
Správa omezeného prostředku
Vlákna vstupují do semaforu voláním různých metod v závislosti na typu semaforu. System.Threading.Semaphore Pro objekt zavolejte metodu WaitOne (zděděnou z WaitHandle). Pro objekt SemaphoreSlim volejte metodu SemaphoreSlim.Wait nebo SemaphoreSlim.WaitAsync. Když se volání vrátí, hodnota semaforického čítače se sníží. Když vlákno požaduje položku a počet je nula, vlákno blokuje. Když vlákna uvolní semafor voláním metody Semaphore.Release nebo SemaphoreSlim.Release, blokovaná vlákna mohou vstoupit. Neexistuje žádné zaručené pořadí, jako je first-in, first-out (FIFO) nebo last-in, first-out (LIFO), které by určovalo, které blokované vlákno vstoupí do semaforu jako další.
Vlákno může vícekrát vstoupit do semaforu voláním metody objektu System.Threading.Semaphore nebo metody objektu WaitOneSemaphoreSlim opakovaně. Chcete-li uvolnit semafor, zavolejte metodu Semaphore.Release() nebo SemaphoreSlim.Release() stejný početkrát, kolikrát vlákno vstoupilo. Případně zavolejte Semaphore.Release(Int32) nebo SemaphoreSlim.Release(Int32) přetížte a zadejte počet položek, které se mají uvolnit.
Semaphores a identita vlákna
Dva typy semaforů nevynucují identitu vlákna na volání metod WaitOne, Wait, Release a SemaphoreSlim.Release. Například běžný scénář použití pro semafory zahrnuje vlákno producenta a vlákno příjemce, přičemž jedno vlákno vždy zvyšuje počet semaforů a druhé jej vždy snižuje.
Ujistěte se, že vlákno nevyvolá příliš mnohokrát semafor. Předpokládejme například, že semafor má maximální počet dvou a že vlákno A a vlákno B vstoupí do semaforu. Pokud programovací chyba ve vlákně B způsobí, že se volá Release dvakrát, obě volání proběhnou úspěšně. Počet na semaforu je plný a když vlákno A nakonec zavolá Release, je vyvolána výjimka SemaphoreFullException.
Pojmenované semafory
Operační systém Windows umožňuje, aby semafory měly názvy. Pojmenovaný semafor je na úrovni celého systému – po vytvoření je viditelný pro všechna vlákna ve všech procesech. Pojmenované semafory mohou tedy synchronizovat aktivity procesů i vlákna.
Vytvořte Semaphore objekt, který představuje pojmenovaný systémový semafor pomocí jednoho z konstruktorů, který určuje název.
Důležité
Vzhledem k tomu, že pojmenované semafory jsou systémově široké, je možné mít více Semaphore objektů, které představují stejný pojmenovaný semafor. 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é reprezentují stejný semafor.
Při použití pojmenovaných semaforů buďte opatrní. Vzhledem k tomu, že jsou systémově rozšířené, může jiný proces, který používá stejný název, neočekávaně vstoupit do vašeho semaforu. Š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ím 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, vytváří okno zranitelnosti. 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ů.