Komponenty bezpečné pro přístup z více vláken
Sdílení zdrojů mezi podprocesy je časté nezbytnost v programování s více podprocesy.Více podprocesů potřebovat přístup ke sdílené databázi pro instanci nebo provést aktualizace nastavení systémových proměnných.Při více současně pokusí o přístup ke sdíleným prostředkům možnost spor dochází.Spor existuje podprocesem zdroj neplatný stav a poté jiný podproces pokusí o přístup k danému prostředku a použití v neplatném stavu.Příklad:
Public Class WidgetManipulator
Public TotalWidgets as Integer = 0
Public Sub AddWidget()
TotalWidgets += 1
Console.WriteLine("Total widgets = " & TotalWidgets.ToString)
End Sub
Public Sub RemoveWidgets()
TotalWidgets -= 10
End Sub
End Class
public class WidgetManipulator
{
public int TotalWidgets = 0;
public void AddWidget()
{
TotalWidgets++;
Console.WriteLine("Total widgets = " + TotalWidgets.ToString());
}
public void RemoveWidgets()
{
TotalWidgets -= 10;
}
}
Tato třída poskytuje dvě metody.Jedna metoda AddWidget , přidá 1 TotalWidgets pole a hodnoty do konzoly.Druhá metoda odečte od hodnoty 10 TotalWidgets .Zvažte, co by nastat pokud současně dvě podprocesy pokusu o přístup stejnou instanci WidgetManipulator třídy.Jeden podproces může volat AddWidget současně druhý podproces nazývá RemoveWidgets .V tomto případě hodnotu TotalWidgets by se změnit druhý podproces, než může první podproces hlásí přesné hodnoty.Tento spor může způsobit nesprávné výsledky uváděné a může způsobit poškození dat.
Zabránění vznik sporu pomocí zámků
Můžete kritické části kódu ochránit před sporech využíváním zámky.Zámek, který je reprezentován klíčových slov jazyka Visual Basic Příkaz SyncLock, nebo klíčové slovo C# příkazem zámku, umožňuje získání výhradních práv na objektu podproces.Následující příklad znázorňuje uzamčení:
SyncLock MyObject
' Insert code that affects MyObject.
End SyncLock
lock(MyObject)
{
// Insert code that affects MyObject.
}
Když dojde k uzamčení, provádění na zadaný objekt ( MyObject v předchozím příkladu) blokována, dokud vlákno lze získat výhradní přístup k objektu.Při dosažení konce zámek zámek uvolněno a spuštění pokračuje normálně.Můžete získat pouze zámek na objekt, který vrací odkaz.Tímto způsobem nelze zamknout typ hodnoty.
Nevýhody zámky
Ačkoli pomocí zámků zaručí, že více podprocesů zároveň neměli přístup k objektu, mohou způsobit, že výraznému snížení výkonu.Představte si program s mnoha různých podprocesů, spuštěných.Pokud každý podproces musí používat určitý objekt a získat výhradní zámek objekt před spuštěním čekat, podprocesy budou všechny ukončí provádění a zálohujte za sebou, způsobuje snížení výkonu.Z těchto důvodů používejte pouze zámky mají kód, který musí být provedeny jako celek.Můžete například aktualizovat více zdrojů, které byly vzájemně závislé.Tento kód je označováno jako atomovou.Omezení pouze na kód, který musí být provedeny atomicky vaše zámky umožní zapsat podprocesy součásti, které zajistí bezpečnost dat při zachování stále dobrý výkon.
Rovněž musí být pečlivě vyhnout situacím, kdy zablokování může dojít.Více podprocesů v tomto případě počkejte druhé vydání sdílené prostředky.Například podproces 1 může podržte uzamčení prostředku a čeká na prostředek B.Podproces 2, na druhé straně může mít zámek na prostředku b a čeká na prostředku A.V takovém případě ani jeden podproces bude možné pokračovat.Jediným způsobem, jak se vyhnout situacím, zablokování je prostřednictvím pečlivě programování.
Viz také
Úkoly
Postupy: Koordinace více vláken provádění
Postupy: Manipulace s ovládacími prvky z vláken
Návod: Vytvoření jednoduché vícevláknové komponenty pomocí sady Visual Basic
Návod: Vytvoření jednoduché vícevláknové komponenty pomocí Visual C#
Referenční dokumentace
Koncepty
Přehled asynchronních vzorů založených na událostech