Bagikan melalui


Fungsi EnterCriticalSection (synchapi.h)

Menunggu kepemilikan objek bagian penting yang ditentukan. Fungsi mengembalikan ketika utas panggilan diberikan kepemilikan.

Sintaks

void EnterCriticalSection(
  [in, out] LPCRITICAL_SECTION lpCriticalSection
);

Parameter

[in, out] lpCriticalSection

Penunjuk ke objek bagian penting.

Nilai kembali

Fungsi ini tidak mengembalikan nilai.

Fungsi ini dapat meningkatkan EXCEPTION_POSSIBLE_DEADLOCK, juga dikenal sebagai STATUS_POSSIBLE_DEADLOCK, jika operasi tunggu pada waktu bagian kritis habis. Interval batas waktu ditentukan oleh nilai registri berikut: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\CriticalSectionTimeout. Jangan menangani kemungkinan pengecualian kebuntuan; sebagai gantinya, debug aplikasi.

Keterangan

Utas dari satu proses dapat menggunakan objek bagian penting untuk sinkronisasi pengecualian bersama. Proses ini bertanggung jawab untuk mengalokasikan memori yang digunakan oleh objek bagian penting, yang dapat dilakukannya dengan mendeklarasikan variabel jenis CRITICAL_SECTION. Sebelum menggunakan bagian penting, beberapa utas proses harus memanggil InitializeCriticalSection atau InitializeCriticalSectionAndSpinCount untuk menginisialisasi objek.

Untuk mengaktifkan akses yang saling eksklusif ke sumber daya bersama, setiap utas memanggil fungsi EnterCriticalSection atau TryEnterCriticalSection untuk meminta kepemilikan bagian penting sebelum menjalankan bagian kode apa pun yang mengakses sumber daya yang dilindungi. Perbedaannya adalah bahwa TryEnterCriticalSection segera kembali, terlepas dari apakah ia mendapatkan kepemilikan bagian penting, sementara EnterCriticalSection memblokir sampai utas dapat mengambil kepemilikan dari bagian penting. Setelah selesai menjalankan kode yang dilindungi, utas menggunakan fungsi LeaveCriticalSection untuk melepaskan kepemilikan, memungkinkan utas lain untuk menjadi pemilik dan mengakses sumber daya yang dilindungi. Tidak ada jaminan tentang urutan di mana utas tunggu akan memperoleh kepemilikan bagian penting.

Setelah utas memiliki kepemilikan bagian penting, utas dapat melakukan panggilan tambahan ke EnterCriticalSection atau TryEnterCriticalSection tanpa memblokir eksekusinya. Ini mencegah utas dari kebuntuan itu sendiri sambil menunggu bagian penting yang sudah dimilikinya. Utas memasuki bagian penting setiap kali EnterCriticalSection dan TryEnterCriticalSection berhasil. Utas harus memanggil LeaveCriticalSection sekali untuk setiap kali memasuki bagian penting.

Setiap utas proses dapat menggunakan fungsi DeleteCriticalSection untuk merilis sumber daya sistem yang dialokasikan saat objek bagian penting diinisialisasi. Setelah fungsi ini dipanggil, objek bagian penting tidak dapat lagi digunakan untuk sinkronisasi.

Jika utas berakhir saat memiliki kepemilikan bagian penting, status bagian kritis tidak terdefinisi.

Jika bagian penting dihapus saat masih dimiliki, status utas yang menunggu kepemilikan bagian penting yang dihapus tidak ditentukan.

Saat proses keluar, jika panggilan ke EnterCriticalSection akan diblokir, itu akan segera mengakhiri proses. Ini dapat menyebabkan destruktor global tidak dipanggil.

Contoh

Untuk contoh yang menggunakan EnterCriticalSection, lihat Menggunakan Objek Bagian Penting.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows XP [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header synchapi.h (termasuk Windows.h pada Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2)
Pustaka Kernel32.lib
DLL Kernel32.dll

Lihat juga

Objek Bagian Kritis

DeleteCriticalSection

InitializeCriticalSection

InitializeCriticalSectionAndSpinCount

LeaveCriticalSection

Fungsi Sinkronisasi

TryEnterCriticalSection

Api Vertdll tersedia di enklave VBS