Za normálnych okolností, pokiaľ je zapojené viacvláknové programovanie, zložitosť programu sa výrazne zvýši, výkon výrazne klesne a pravdepodobnosť chýb sa výrazne zvýši.
Viacvláknové programovanie je určené na paralelné spúšťanie programu na zlepšenie schopností spracovania dát, ale vo väčšine prípadov ide o súťaž o zdieľané zdroje, preto musí byť uzamknuté pri úprave objektov zdrojov. Existuje však mnoho spôsobov, ako implementovať zámky, preto sa pozrime na implementáciu a výkon viacerých typov zámkov v C#.
Niekoľko spôsobov použitia zámkov
1. Atómový zámok
Dosiahnuť "bezlockovú" konkurenciu prostredníctvom atómovej operácie Interlocked.CompareExchange.
Oficiálne vysvetlenie je poskytnúť atómové operácie pre premenné zdieľané viacerými vláknami. Menný priestor: System.Threading
2. Kritická oblasť
Serializácia viacerých vlákien na prístup k verejným zdrojom alebo kódu je rýchla a vhodná na kontrolu prístupu k dátam. Zámková syntax v C# je syntax sugar pre kritickú oblasť (Monitor).
3. Atómová prevádzka
Atómové operácie, ktoré sú špeciálnym prípadom, sú inherentne bezpečné pre vlákna, takže ich nie je potrebné zamykať.
Oficiálne interpretované ako zvýšenie hodnoty danej premennej vo forme atómovej operácie a uloženie výsledku. Menný priestor: System.Threading
4. Zámok čítania a zápisu
Zámky na čítanie a zápis umožňujú čítať zdroje, keď iné programy píšu, takže ak zdroj umožňuje nesprávne čítanie, je to vhodnejšie.
Oficiálne vysvetlenie uvádza uzamknutý stav používaný na správu prístupu k zdrojom, čo umožňuje viacvláknové čítanie alebo exkluzívny zápis. Menný priestor je System.Threading
5. Semafor
Semafory, navrhnuté na kontrolu obmedzeného počtu používateľských zdrojov.
Oficiálne vysvetlenie obmedzuje počet vlákien, ktoré môžu súčasne pristupovať k zdrojom alebo zdrojovému fondu. Menný priestor je System.Threading
6. Podujatia
Používa sa na upozornenie vlákna, že sa vyskytli určité udalosti, čím sa spustí začiatok následnej úlohy.
Oficiálne vysvetlenie uvádza, že udalosti synchronizácie vlákien sa automaticky resetujú, keď je signál prijatý po uvoľnení vlákna. Takéto typy sa nedajú dediť.
7. Vzájomné vylúčenie
Existuje trieda Mutex v C#, hneď pod menným priestorom System.threading, Mutex je v skutočnosti mutex, ktorý dokáže nielen riešiť konkurenciu zdrojov medzi viacerými vláknami, ale aj konkurenciu zdrojov medzi procesmi.
Kód na testovanie výkonu
Spustiť kód
Výsledky výkonnostných testov
Poznámka: Vyššie uvedené údaje sú len výsledkom hardvérového výkonu aktuálneho testovacieho prostredia a môžu byť porovnávané len medzi sebou.
1) V rôznych testoch je určite najrýchlejšie, keď sa nezamkne, takže sa snažte vyhnúť konkurencii zdrojov, ktorá vedie k uzamknutej prevádzke.
2) Interlocked.CompareExchange konzistentne vykazuje lepší výkon v multithreadingu a je druhý.
3) Tretí zámok, kritická zóna, tiež ukazuje dobrý výkon, preto prosím vyvrátite ostatných, ktorí tvrdia, že výkon zámku je nízky.
4) Štvrtým miestom je operácia atómových premenných (atómová), ale v súčasnosti podporuje iba samo-zvyšovanie a odčítanie premenných, pričom jeho použiteľnosť nie je silná.
5) Výkon piateho zámku na čítanie/zápis (ReaderWriterLockSlim) je tiež v poriadku, podporuje čítanie ničoho a praktickosť je stále relatívne dobrá.
6) Zvyšné semafory, podujatia a mutex majú samozrejme najhorší výkon, majú svoj vlastný rozsah využitia, ale nefungujú dobre pri konkurencii zdrojov.
Pôvodná adresa odkazu:Prihlásenie na hypertextový odkaz je viditeľné.
|