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


CCriticalSection osztály

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

Egy "kritikus szakaszt" jelöl – egy szinkronizálási objektumot, amely lehetővé teszi, hogy egyszerre egy szál hozzáférjen egy erőforráshoz vagy kódszakaszhoz.

Szemantika

class CCriticalSection : public CSyncObject

Tagok

Nyilvános konstruktorok

Név Description
CCriticalSection::CCriticalSection Egy CCriticalSection objektumot hoz létre.

Nyilvános metódusok

Név Description
CCriticalSection::Lock Az objektumhoz CCriticalSection való hozzáféréshez használható.
CCriticalSection::Unlock Felszabadítja az CCriticalSection objektumot.

Nyilvános operátorok

Név Description
CCriticalSection::operator CRITICAL_SECTION* A belső CRITICAL_SECTION objektumra mutató mutatót kér le.

Nyilvános adatok tagjai

Név Description
CCriticalSection::m_sect Egy CRITICAL_SECTION objektum.

Megjegyzések

A kritikus szakaszok akkor hasznosak, ha egyszerre csak egy szál módosíthatja az adatokat vagy más vezérelt erőforrásokat. Csomópontok hozzáadása például egy csatolt listához olyan folyamat, amelyet egyszerre csak egy szálnak kell engedélyeznie. Ha objektumot CCriticalSection használ a csatolt lista vezérlésére, egyszerre csak egy szál férhet hozzá a listához.

Megjegyzés:

Az osztály funkcióit CCriticalSection egy tényleges Win32-objektum CRITICAL_SECTION biztosítja.

A kritikus szakaszokat a rendszer mutexek helyett (lásd CMutex) használja, ha a sebesség kritikus, és az erőforrás nem lesz használható a folyamathatárok között.

Az objektumok használatára CCriticalSection két módszer létezik: önálló és osztályba ágyazott.

  • Önálló metódus Önálló objektum használatához CCriticalSection szükség esetén hozza létre az CCriticalSection objektumot. A konstruktor sikeres visszatérése után explicit módon zárolja az objektumot egy hívással.Lock Hívjon Unlock , ha befejezte a kritikus szakasz elérését. Ez a módszer, bár a forráskódot olvasó személy számára egyértelműbb, hajlamosabb a hibára, mivel nem szabad elfelejtenie, hogy a hozzáférés előtt és után zárolni és feloldani kell a kritikus szakaszt.

    A jobb módszer az osztály használata CSingleLock . Emellett rendelkezik egy és Unlock egy Lock metódussal is, de nem kell aggódnia az erőforrás zárolásának feloldásával, ha kivétel történik.

  • Beágyazott módszer: Az osztályokat több szálon is megoszthatja, ha hozzáad egy CCriticalSection-type adattagot az osztályhoz, és szükség esetén zárolja az adattagot.

Az objektumok használatáról CCriticalSection további információt a Többszálúság: A szinkronizálási osztályok használata című cikkben talál.

Öröklési hierarchia

CObject

CSyncObject

CCriticalSection

Requirements

Fejléc:afxmt.h

CCriticalSection::CCriticalSection

Egy CCriticalSection objektumot hoz létre.

CCriticalSection();

Megjegyzések

Objektum eléréséhez vagy kiadásához CCriticalSection hozzon létre egy objektumotCSingleLock, és hívja meg annak és Unlock tagfüggvényeitLock. Ha az CCriticalSection objektumot önállóan használja, hívja meg annak tagfüggvényét Unlock a kiadásához.

Ha a konstruktor nem tudja lefoglalni a szükséges rendszermemóriát, a rendszer automatikusan kivesz egy memóriakivételt (típus).CMemoryException

Example

Lásd a CCriticalSection::Lock példát.

CCriticalSection::Lock

Hívja meg ezt a tagfüggvényt, hogy hozzáférjen a kritikus szakaszobjektumhoz.

BOOL Lock();
BOOL Lock(DWORD dwTimeout);

Paraméterek

dwTimeout Lock figyelmen kívül hagyja ezt a paraméterértéket.

Visszaadott érték

Nonzero, ha a függvény sikeres volt; egyéb esetben 0.

Megjegyzések

Lock egy blokkoló hívás, amely addig nem ad vissza, amíg a kritikus szakaszobjektum nem lesz jelezve (elérhetővé válik).

Ha időtúllépésre van szükség, objektum helyett objektumot CMutexCCriticalSection használhat.

Ha Lock a rendszer nem tudja lefoglalni a szükséges rendszermemóriát, a rendszer automatikusan kivesz egy memóriakivételt (típus).CMemoryException

Example

Ez a példa a beágyazott kritikus szakasz megközelítését mutatja be egy megosztott erőforráshoz (a statikus _strShared objektumhoz) való hozzáférés egy megosztott CCriticalSection objektum használatával történő szabályozásával. A SomeMethod függvény egy megosztott erőforrás biztonságos frissítését mutatja be.

//Definition of critical section class
class CMyCritSectClass
{
   static CString _strShared; //shared resource
   static CCriticalSection _critSect;

public:
   CMyCritSectClass(void) {}
   ~CMyCritSectClass(void) {}
   void SomeMethod(void); //locks, modifies, and unlocks shared resource
};

//Declaration of static members and SomeMethod
CString CMyCritSectClass::_strShared;
CCriticalSection CMyCritSectClass::_critSect;

void CMyCritSectClass::SomeMethod()
{
   _critSect.Lock();
   if (_strShared == "")
      _strShared = "<text>";
   _critSect.Unlock();
}

CCriticalSection::m_sect

Az összes CCriticalSection metódus által használt kritikus szakaszobjektumot tartalmazza.

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

Beolvas egy objektumot CRITICAL_SECTION .

operator CRITICAL_SECTION*();

Megjegyzések

Hívja meg ezt a függvényt a belső CRITICAL_SECTION objektumra mutató mutató lekéréséhez.

CCriticalSection::Unlock

Felszabadítja az CCriticalSection objektumot egy másik szál általi használatra.

BOOL Unlock();

Visszaadott érték

Nonzero, ha az CCriticalSection objektum a szál tulajdonában volt, és a kiadás sikeres volt, egyébként 0.

Megjegyzések

Ha a CCriticalSection használatban lévő erőforrást önállóan használja, Unlock a kritikus szakasz által vezérelt erőforrás használatának befejezése után azonnal meg kell hívni. Ha objektumot CSingleLock használ, CCriticalSection::Unlock a zárolási objektum tagfüggvénye Unlock hívja meg.

Example

Lásd a példát a CCriticalSection::Lock.

Lásd még

CSyncObject osztály
hierarchiadiagram
CMutex osztály