Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az erőforráshoz való hozzáférés szinkronizálásához használja az egyik szinkronizálási objektumot az egyik várakozási függvényben. A szinkronizálási objektum állapota jelzett vagy nem jelzett lehet. A várakozási függvények lehetővé teszik, hogy egy szál blokkolja saját végrehajtását, amíg egy megadott, nem jelzett állapotú objektum jelzett állapotba nem kerül. További információ: Folyamatközi szinkronizálás.
A megfelelő szinkronizálási primitív kiválasztása
| Primitív | Scope | Teljesítmény | Újraküldés | Mikor érdemes használni? |
|---|---|---|---|---|
| Vékony olvasó/író (SRW) zárolása | Egyetlen folyamat | Gyors (általában felhasználói módban; versengés esetén beléphet kernelmódba) | No | Alapértelmezett választás az olvasói terhelésű számítási feladatokhoz a modern kódban. Legkisebb memóriaigény (egy mutató méretével megegyező). |
| Kritikus szakasz | Egyetlen folyamat | Gyors (pörgetés, majd kernel-várakozás) | Igen | Használja, ha egy folyamaton belül reentráns/rekurzív zárolásra van szükség. Kissé nagyobb, mint az SRW. |
| Mutex | Folyamatok közötti (elnevezett) | Lassabb (mindig kernelobjektum) | Igen | A folyamatok egy nevesített mutexen keresztüli szinkronizálásához szükséges. Szintén hasznos a WaitForMultipleObjects. |
| Szemafor | Folyamatok közötti (elnevezett) | Kernel-objektum | N/A | Korlátozza az erőforráskészlethez való egyidejű hozzáférést (például az N-elemek kapcsolatkészletét). |
| Esemény | Folyamatközi (névvel ellátott) | Kernel-objektum | N/A | Jelátvitel szálak/folyamatok között. A "valami történt" értesítésekhez használható, nem az adatok védelméhez. |
C++ std::mutex / std::shared_mutex |
Egyetlen folyamat | A megvalósítás által meghatározott | No | Hordozható C++-kódhoz és a RAII használatához ajánlott. Akkor használja, ha nincs szüksége a Win32 várakozási API-ira vagy a folyamatközi szinkronizálásra. |
Note
SRW-zárolások és kritikus szakaszok: Olyan új kód esetén, amely nem igényel rekurzív zárolást, válassza az SRW-zárolásokat (AcquireSRWLockExclusive/AcquireSRWLockShared). Kisebbek, gyorsabbak és támogatják az olvasói/írói szemantikát. A kritikus szakaszok akkor is megfelelőek, ha ugyanazon a szálon kell újrakurzív (rekurzív) beszerzést igényelnie.
Important
Gyakori hiba: Mutex használata folyamaton belüli szinkronizáláshoz, ha egy kritikus szakasz vagy SRW-zárolás elegendő lenne. A mutexek használata mindig kernelmódba való váltással jár, ami jelentősen lassabbá teszi őket az egyetlen folyamaton belüli, nagy gyakoriságú műveletek esetén.
A következő szinkronizálási mechanizmusok a következők:
- átfedésben lévő bemenet és kimenet
- aszinkron eljáráshívások
- kritikus szakaszobjektumok
- feltételváltozók
- vékony olvasó-/írózárak
- egyszeri inicializálás
- összekapcsolt változóhozzáférés
- összekapcsolt, egymáshoz csatolt listák
- időzítősorok
- a MemoryBarrier makró
További információ a szinkronizálásról: Szinkronizálási és többprocesszoros problémák.