Megosztás a következőn keresztül:


Többszálú: Mikor érdemes használni az MFC szinkronizálási osztályokat?

Az MFC-hez biztosított többszálú osztályok két kategóriába sorolhatók: szinkronizálási objektumok (CSyncObject, CSemaphore, CMutex, CCriticalSection és CEvent) és szinkronizálási hozzáférési objektumok (CMultiLock és CSingleLock).

A szinkronizálási osztályok akkor használatosak, ha az erőforráshoz való hozzáférést szabályozni kell az erőforrás integritásának biztosítása érdekében. A szinkronizálási hozzáférési osztályok segítségével férhet hozzá ezekhez az ellenőrzött erőforrásokhoz. Ez a témakör azt ismerteti, hogy mikor érdemes használni az egyes osztályokat.

A használni kívánt szinkronizálási osztály meghatározásához tegye fel a következő kérdések sorozatát:

  1. Az alkalmazásnak várnia kell valamire, mielőtt hozzáférne az erőforráshoz (például adatokat kell fogadnia egy kommunikációs portról, mielőtt fájlba írható lenne)?

    Ha igen, használja CEvent.

  2. Egyszerre több szál is hozzáfér ehhez az erőforráshoz ugyanazon az alkalmazáson belül (például az alkalmazás legfeljebb öt ablakot engedélyez ugyanazon dokumentum nézeteivel)?

    Ha igen, használja CSemaphore.

  3. Több alkalmazás is használhatja ezt az erőforrást (például az erőforrás EGY DLL-ben található)?

    Ha igen, használja CMutex.

    Ha nem, használja a CCriticalSection.

CSyncObject soha nem használják közvetlenül. Ez a másik négy szinkronizálási osztály alaposztálya.

1. példa: Három szinkronizálási osztály használata

Példaként vegyünk egy alkalmazást, amely egy csatolt fióklistát tart fenn. Ez az alkalmazás legfeljebb három fiók vizsgálatát teszi lehetővé külön ablakban, de egy adott időpontban csak egy frissíthető. A fiók frissítésekor a frissített adatokat a rendszer a hálózaton keresztül továbbítja egy adatarchívumnak.

Ez a példaalkalmazás mindhárom szinkronizálási osztályt használja. Mivel egyszerre legfeljebb három fiókot vizsgálhat meg, a három nézet objektumhoz való hozzáférés korlátozására használható CSemaphore . Amikor megkísérli megtekinteni a negyedik fiókot, az alkalmazás vagy megvárja, amíg az első három ablak valamelyike bezárul, vagy sikertelen lesz. A fiók frissítésekor az alkalmazás azt biztosítja CCriticalSection , hogy egyszerre csak egy fiók legyen frissítve. A frissítés sikerességét követően a rendszer jelzéseket küld CEvent, amelyek egy szálat bocsátanak ki, amely az esemény jelzésére vár. Ez a szál elküldi az új adatokat az adatarchívumnak.

2. példa: Szinkronizálási hozzáférési osztályok használata

A használni kívánt szinkronizálási hozzáférési osztály kiválasztása még egyszerűbb. Ha az alkalmazás csak egyetlen szabályozott erőforrás elérésével foglalkozik, használja a következőt CSingleLock: Ha több ellenőrzött erőforrás bármelyikéhez hozzá kell férnie, használja a következőt CMultiLock: . Az 1. példában CSingleLock alkalmazása lett volna indokolt, mert minden esetben csak egy erőforrásra van szükség egy adott időben.

A szinkronizálási osztályok használatáról további információt a Többszálúság: A szinkronizálási osztályok használata című témakörben talál. A szinkronizálásról további információt a Szinkronizálás a Windows SDK-ban című témakörben talál. Az MFC többszálú támogatásáról további információt a C++ és az MFC többszálú használata című témakörben talál.

Lásd még

Többszálúság C++ és MFC használatával