Share via


Adatok szinkronizálása többszálú használatra

Ha több szál is indíthat hívásokat egyetlen objektum tulajdonságaira és metódusára, kritikus fontosságú, hogy ezek a hívások szinkronizálódjanak. Ellenkező esetben az egyik szál megszakíthatja a másik szál működését, és az objektum érvénytelen állapotban maradhat. Az osztályt, amelynek tagjai védettek az ilyen megszakításoktól, szálbiztosnak nevezzük.

A .NET számos stratégiát biztosít a példányokhoz és statikus tagokhoz való hozzáférés szinkronizálásához:

  • Szinkronizált kódrégiók. Az osztály vagy a Monitor fordító támogatásával csak az azt igénylő kódblokkot szinkronizálhatja, ami javítja a teljesítményt.

  • Manuális szinkronizálás. A .NET-osztálytár által biztosított szinkronizálási objektumokat használhatja. Lásd a szinkronizálási primitívek áttekintését, amely tartalmazza az Monitor osztály megvitatását.

  • Szinkronizált környezetek. Csak .NET-keretrendszer és Xamarin-alkalmazások esetén engedélyezheti az SynchronizationAttribute objektumok egyszerű, automatikus szinkronizálásátContextBoundObject.

  • Gyűjteményosztályok a System.Collections.Concurrent névtérben. Ezek az osztályok beépített szinkronizált hozzáadási és eltávolítási műveleteket biztosítanak. További információ: Thread-Széf Collections.

A közös nyelvi futtatókörnyezet olyan szálmodellt biztosít, amelyben az osztályok számos kategóriába sorolhatók, amelyek a követelményektől függően különböző módokon szinkronizálhatók. Az alábbi táblázat azt mutatja be, hogy az adott szinkronizálási kategóriához tartozó mezők és metódusok milyen szinkronizálási támogatást kapnak.

Kategória Globális mezők Statikus mezők Statikus metódusok Példánymezők Példány metódusai Adott kódblokkok
Nincs szinkronizálás Nem Nem Nem Nem Nem Nem
Szinkronizált környezet Nem Nem Nem Igen Igen Nem
Szinkronizált kódrégiók Nem Nem Csak ha meg van jelölve Nem Csak ha meg van jelölve Csak ha meg van jelölve
Manuális szinkronizálás Manuális Manuális Manuális Manuális Manuális Manuális

Nincs szinkronizálás

Ez az objektumok alapértelmezett értéke. Bármely szál bármikor hozzáférhet bármilyen metódushoz vagy mezőhöz. Ezeket az objektumokat egyszerre csak egy szál érheti el.

Manuális szinkronizálás

A .NET-osztálytár számos osztályt biztosít a szálak szinkronizálásához. Lásd a szinkronizálási primitívek áttekintését.

Szinkronizált kódterületek

Az osztály vagy a fordító kulcsszó használatával szinkronizálhatja a Monitor kódblokkokat, a példánymetodusokat és a statikus metódusokat. A szinkronizált statikus mezők nem támogatottak.

A Visual Basic és a C# egyaránt támogatja a kódblokkok megjelölését egy adott nyelvi kulcsszóval, a lock C# utasítással vagy a SyncLock Visual Basic utasításával. Amikor a kódot egy szál hajtja végre, a rendszer kísérletet tesz a zárolás beszerzésére. Ha a zárolást már beszerezte egy másik szál, a szál addig blokkolódik, amíg a zárolás elérhetővé nem válik. Amikor a szál kilép a szinkronizált kódblokkból, a zárolás felszabadul, függetlenül attól, hogy a szál hogyan lép ki a blokkból.

Feljegyzés

A C# 13-tól kezdődően az lock utasítás felismeri, hogy a zárolt objektum egy példány System.Threading.Lock , és a EnterScope módszerrel szinkronizált régiót hoz létre. A lock, ha a cél nem példány Lock , és SyncLock az utasítások implementálva Monitor.Enter vannak, és Monitor.Exitígy más metódusok Monitor is használhatók velük együtt a szinkronizált régióban.

Egy metódust MethodImplAttribute olyan értékkel MethodImplOptions.Synchronizedis dekorálhat, amelynek ugyanolyan hatása van, mint a fordítói kulcsszavak egyikének használata Monitor a metódus teljes törzsének zárolásához.

Thread.Interrupt Segítségével a szálakat ki lehet szakítani a blokkolási műveletekből, például a kód szinkronizált régiójához való hozzáférésre való várakozásra. A Thread.Interrupt a szálak olyan műveletekből való megszakítására is használható, mint a Thread.Sleep.

Fontos

A metódusok (Shareda Visual Basic metódusai) védelme static érdekében ne zárolja a típust – azaz typeof(MyType) C#-ban, GetType(MyType) Visual Basicben vagy MyType::typeid C++-ban. Ehelyett használjon privát statikus objektumot. Hasonlóképpen ne használja this a C# (Me Visual Basic)-ben a példány metódusának zárolására. Használjon inkább privát objektumot. Az osztályokat vagy példányokat nem a saját kóddal lehet zárolni, ami holtpontot vagy teljesítményproblémákat okozhat.

Fordító támogatása

A Visual Basic és a C# egyaránt támogat egy olyan nyelvi kulcsszót, amely az objektumot használja Monitor.Enter és Monitor.Exit zárolja. A Visual Basic támogatja a SyncLock utasítást; A C# támogatja a zárolási utasítást.

Mindkét esetben, ha a kódblokk kivételt eredményez, a zárolás vagy a SyncLock által beszerzett zárolás automatikusan ki lesz oldva. A C# és a Visual Basic fordítói végül letiltják/ a Figyelő.Enter parancsot a kipróbálás elején, a Monitor.Exit pedig a végső blokkban. Ha a zárolási vagy a SyncLock-blokkon belül kivétel történik, a végső kezelő fut, hogy elvégezhesse a tisztítási munkát.

Szinkronizált környezet

Csak .NET-keretrendszer- és Xamarin-alkalmazásokban az SynchronizationAttribute összes példány metódusát és mezőjét szinkronizálhatja bármelyikenContextBoundObject. Az ugyanabban a környezetben lévő tartomány összes objektuma ugyanazt a zárolást használja. Több szál is hozzáférhet a metódusokhoz és a mezőkhöz, de egyszerre csak egyetlen szál érhető el.

Lásd még