Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Contoh berikut menunjukkan bagaimana sebuah utas (thread) menginisialisasi, memasuki, dan merilis bagian penting . Ini menggunakan fungsi InitializeCriticalSectionAndSpinCount, EnterCriticalSection, LeaveCriticalSection, dan DeleteCriticalSection.
Peringatan
Risiko kebuntuan: Jika utas harus memperoleh beberapa bagian penting, selalu dapatkan dalam urutan yang konsisten dan terdokumen di semua utas. Memperoleh kunci dalam urutan yang berbeda dari utas yang berbeda adalah penyebab kebuntuan yang paling umum. Perhatikan juga bahwa EnterCriticalSection memblokir tanpa batas — gunakan TryEnterCriticalSection untuk upaya memperoleh lock tanpa memblokir, dan terapkan loop percobaan ulang yang dibatasi dengan batas waktu jika Anda perlu memperoleh lock dengan batas waktu.
Note
Alternatif C++ modern: Untuk kode baru, pertimbangkan untuk menggunakan std::mutex dengan std::lock_guard atau std::scoped_lock (C++17), yang menyediakan manajemen kunci berbasis RAII yang memastikan rilis bahkan ketika pengecualian dilemparkan. Untuk beban kerja yang didominasi operasi baca, pertimbangkan kunci Slim Reader/Writer (SRW) atau std::shared_mutex.
// Global variable
CRITICAL_SECTION CriticalSection;
int main( void )
{
...
// Initialize the critical section one time only.
if (!InitializeCriticalSectionAndSpinCount(&CriticalSection,
0x00000400) )
return;
...
// Release resources used by the critical section object.
DeleteCriticalSection(&CriticalSection);
}
DWORD WINAPI ThreadProc( LPVOID lpParameter )
{
...
// Request ownership of the critical section.
EnterCriticalSection(&CriticalSection);
// Access the shared resource.
// Release ownership of the critical section.
LeaveCriticalSection(&CriticalSection);
...
return 1;
}