Bagikan melalui


CCriticalSection Kelas

Mewakili "bagian penting" — objek sinkronisasi yang memungkinkan satu utas pada satu waktu untuk mengakses sumber daya atau bagian kode.

Sintaks

class CCriticalSection : public CSyncObject

Anggota

Konstruktor Publik

Nama Deskripsi
CCriticalSection::CCriticalSection Membuat CCriticalSection objek.

Metode Publik

Nama Deskripsi
CCriticalSection::Lock Gunakan untuk mendapatkan akses ke CCriticalSection objek.
CCriticalSection::Unlock CCriticalSection Melepaskan objek.

Operator Publik

Nama Deskripsi
CCriticalSection::operator CRITICAL_SECTION* Mengambil penunjuk ke objek internal CRITICAL_SECTION .

Anggota Data Publik

Nama Deskripsi
CCriticalSection::m_sect Objek CRITICAL_SECTION.

Keterangan

Bagian penting berguna ketika hanya satu utas pada satu waktu yang dapat diizinkan untuk memodifikasi data atau beberapa sumber daya terkontrol lainnya. Misalnya, menambahkan simpul ke daftar tertaut adalah proses yang seharusnya hanya diizinkan oleh satu utas pada satu waktu. Dengan menggunakan CCriticalSection objek untuk mengontrol daftar tertaut, hanya satu utas pada satu waktu yang bisa mendapatkan akses ke daftar.

Catatan

Fungsionalitas CCriticalSection kelas disediakan oleh objek Win32 CRITICAL_SECTION yang sebenarnya.

Bagian penting digunakan alih-alih mutex (lihat CMutex) ketika kecepatan sangat penting dan sumber daya tidak akan digunakan di seluruh batas proses.

Ada dua metode untuk menggunakan CCriticalSection objek: berdiri sendiri dan disematkan di kelas.

  • Metode berdiri sendiri Untuk menggunakan objek yang berdiri sendiri CCriticalSection , buat CCriticalSection objek saat diperlukan. Setelah berhasil mengembalikan dari konstruktor, secara eksplisit mengunci objek dengan panggilan ke Lock. Hubungi Unlock saat Anda selesai mengakses bagian penting. Metode ini, sementara lebih jelas bagi seseorang yang membaca kode sumber Anda, lebih rentan terhadap kesalahan karena Anda harus ingat untuk mengunci dan membuka kunci bagian penting sebelum dan sesudah akses.

    Metode yang lebih disukai adalah menggunakan CSingleLock kelas . Ini juga memiliki Lock metode dan Unlock , tetapi Anda tidak perlu khawatir tentang membuka kunci sumber daya jika terjadi pengecualian.

  • Metode tersemat Anda juga dapat berbagi kelas dengan beberapa utas dengan menambahkan CCriticalSectionanggota data jenis ke kelas dan mengunci anggota data saat diperlukan.

Untuk informasi selengkapnya tentang menggunakan CCriticalSection objek, lihat artikel Multithreading: Cara Menggunakan Kelas Sinkronisasi.

Hierarki Warisan

CObject

CSyncObject

CCriticalSection

Persyaratan

Header: afxmt.h

CCriticalSection::CCriticalSection

Membuat CCriticalSection objek.

CCriticalSection();

Keterangan

Untuk mengakses atau merilis CCriticalSection objek, buat CSingleLock objek dan panggil fungsi dan Unlock anggotanyaLock. CCriticalSection Jika objek digunakan berdiri sendiri, panggil fungsi anggotanya Unlock untuk merilisnya.

Jika konstruktor gagal mengalokasikan memori sistem yang diperlukan, pengecualian memori (jenis CMemoryException) secara otomatis dilemparkan.

Contoh

Lihat contoh untuk CCriticalSection::Lock.

CCriticalSection::Lock

Panggil fungsi anggota ini untuk mendapatkan akses ke objek bagian penting.

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

Parameter

dwTimeoutLock mengabaikan nilai parameter ini.

Tampilkan Nilai

Bukan nol jika fungsi berhasil; jika tidak, 0.

Keterangan

Lock adalah panggilan pemblokiran yang tidak akan kembali sampai objek bagian penting disinyalir (tersedia).

Jika waktu tunggu diperlukan, Anda dapat menggunakan CMutex objek alih-alih CCriticalSection objek.

Jika Lock gagal mengalokasikan memori sistem yang diperlukan, pengecualian memori (jenis CMemoryException) secara otomatis dilemparkan.

Contoh

Contoh ini menunjukkan pendekatan bagian penting berlapis dengan mengontrol akses ke sumber daya bersama (objek statis _strShared ) menggunakan objek bersama CCriticalSection . Fungsi ini SomeMethod menunjukkan pembaruan sumber daya bersama dengan cara yang aman.

//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

Berisi objek bagian penting yang digunakan oleh semua CCriticalSection metode.

CRITICAL_SECTION m_sect;

CCriticalSection::operator CRITICAL_SECTION*

Mengambil CRITICAL_SECTION objek.

operator CRITICAL_SECTION*();

Keterangan

Panggil fungsi ini untuk mengambil penunjuk ke objek internal CRITICAL_SECTION .

CCriticalSection::Unlock

Merilis objek untuk digunakan oleh utas CCriticalSection lain.

BOOL Unlock();

Tampilkan Nilai

Bukan nol jika CCriticalSection objek dimiliki oleh utas dan rilis berhasil; jika tidak, 0.

Keterangan

CCriticalSection Jika sedang digunakan sendiri, Unlock harus dipanggil segera setelah menyelesaikan penggunaan sumber daya yang dikontrol oleh bagian penting. CSingleLock Jika objek sedang digunakan, CCriticalSection::Unlock akan dipanggil oleh fungsi anggota objek Unlock kunci.

Contoh

Lihat contoh untuk CCriticalSection::Lock.

Lihat juga

CSyncObject Kelas
Bagan Hierarki
CMutex Kelas