Za normálních okolností, pokud je zapojeno vícevláknové programování, složitost programu výrazně vzroste, výkon výrazně klesne a pravděpodobnost chyb se výrazně zvýší.
Vícevláknové programování je určeno k paralelnímu spuštění programu za účelem zlepšení schopností zpracování dat, ale ve většině případů jde o soutěž o sdílené zdroje, proto musí být při úpravě objektů zdrojů uzamčeno. Existuje však mnoho způsobů, jak zámky implementovat, proto se podívejme na implementaci a výkon několika typů zámků v C#.
Několik způsobů, jak zámky využít
1. Atomový zámek
Dosáhnout "bezzámkové" konkurence prostřednictvím atomové operace Interlocked.CompareExchange.
Oficiální vysvětlení je poskytnout atomové operace pro proměnné sdílené více vlákny. Jmenný prostor: System.Threading
2. Kritická oblast
Serializace více vláken pro přístup k veřejným zdrojům nebo kódu je rychlá a vhodná pro řízení přístupu k datům. Zámková syntaxe v C# je syntaxový cukr pro kritickou oblast (Monitor).
3. Atomární operace
Atomické operace, které jsou speciálním případem, jsou ze své podstaty bezvláknové, takže není potřeba je zamykat.
Oficiálně interpretováno jako zvýšení hodnoty dané proměnné ve formě atomové operace a uložení výsledku. Jmenný prostor: System.Threading
4. Zámek čtení a zápisu
Locky pro čtení a zápis umožňují čtení zdrojů, když jiné programy píší, takže pokud zdroj umožňuje nekvalitní čtení, je to vhodnější.
Oficiální vysvětlení uvádí uzamčený stav používaný ke správě přístupu ke zdrojům, což umožňuje vícevláknové čtení nebo exkluzivní zápis. Jmenný prostor je System.Threading
5. Semafor
Semafory, navržené k řízení omezeného počtu uživatelských zdrojů.
Oficiální vysvětlení omezuje počet vláken, která mohou současně přistupovat ke zdroji nebo zdrojovému fondu. Jmenný prostor je System.Threading
6. Události
Používá se k upozornění vlákna, že došlo k některým událostem, čímž se zahajuje zahájení následné úlohy.
Oficiální vysvětlení uvádí, že synchronizační události vláken se automaticky resetují, když je signál přijat po uvolnění vlákna. Takové typy nelze dědit.
7. Vzájemné vyloučení
V C# je třída Mutex, hned pod jmenným prostorem System.threading, Mutex je ve skutečnosti mutex, který dokáže nejen řešit konkurenci zdrojů mezi více vlákny, ale také soutěž zdrojů mezi procesy.
Kód pro testování výkonu
Spusť kód
Výsledky výkonnostních testů
Poznámka: Výše uvedená data jsou pouze výsledkem hardwarového výkonu aktuálního testovacího prostředí a lze je pouze mezi sebou porovnávat.
1) V různých testech je rozhodně nejrychlejší nezamknout, takže se snažte vyhnout konkurenci zdrojů, která vede k uzamčenému provozu.
2) Propojené.CompareExchange konzistentně vykazuje lepší výkon v vícevláknovém zpracování a je druhý.
3) Třetí zámek, kritická zóna, také vykazuje dobrý výkon, proto prosím vyvracejte ostatní, když říkají, že výkon zámku je nízký.
4) Čtvrtým místem je operace s atomickými proměnnými (atomic), ale v současnosti podporuje pouze samo-zvyšování a odečítání proměnných, přičemž použitelnost není silná.
5) Výkon pátého zámku čtení/zápisu (ReaderWriterLockSlim) je také v pořádku, podporuje čtení ničeho a praktičnost je stále relativně dobrá.
6) Zbývající semafory, události a mutex mají samozřejmě nejhorší výkon, mají svůj vlastní rozsah použití, ale nefungují dobře v boji o zdroje.
Původní adresa odkazu:Přihlášení k hypertextovému odkazu je viditelné.
|