Fungsi InitializeCriticalSectionEx (synchapi.h)

Menginisialisasi objek bagian penting dengan jumlah putaran dan bendera opsional.

Sintaks

BOOL InitializeCriticalSectionEx(
  [out] LPCRITICAL_SECTION lpCriticalSection,
  [in]  DWORD              dwSpinCount,
  [in]  DWORD              Flags
);

Parameter

[out] lpCriticalSection

Penunjuk ke objek bagian penting.

[in] dwSpinCount

Jumlah putaran untuk objek bagian kritis. Pada sistem prosesor tunggal, jumlah putaran diabaikan dan jumlah putar bagian kritis diatur ke 0 (nol). Pada sistem multiprosesor, jika bagian kritis tidak tersedia, alur panggilan memutar waktu dwSpinCount sebelum melakukan operasi tunggu pada semaphore yang terkait dengan bagian penting. Jika bagian yang penting menjadi gratis selama operasi spin, utas panggilan menghindari operasi tunggu.

[in] Flags

Parameter ini bisa 0 atau nilai berikut.

Nilai Makna
CRITICAL_SECTION_NO_DEBUG_INFO Bagian penting dibuat tanpa informasi debug.

Nilai kembali

Jika fungsi berhasil, nilai yang dikembalikan bukan nol.

Jika fungsi gagal, nilai yang dikembalikan adalah nol (0). Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.

Keterangan

Utas dari satu proses dapat menggunakan objek bagian penting untuk sinkronisasi pengecualian bersama. Tidak ada jaminan tentang urutan bahwa utas mendapatkan kepemilikan dari bagian kritis, namun, sistem ini adil untuk semua utas.

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 menginisialisasi objek. Anda kemudian dapat memodifikasi jumlah putaran dengan memanggil fungsi SetCriticalSectionSpinCount .

Setelah objek bagian penting diinisialisasi, utas proses dapat menentukan objek dalam fungsi EnterCriticalSection, TryEnterCriticalSection, atau LeaveCriticalSection untuk menyediakan akses yang saling eksklusif ke sumber daya bersama. Untuk sinkronisasi serupa antara alur proses yang berbeda, gunakan objek mutex.

Objek bagian penting tidak dapat dipindahkan atau disalin. Proses ini juga tidak boleh memodifikasi objek, tetapi harus memperlakukannya sebagai buram logis. Gunakan hanya fungsi bagian penting untuk mengelola objek bagian penting. Setelah Anda selesai menggunakan bagian penting, panggil fungsi DeleteCriticalSection .

Objek bagian penting harus dihapus sebelum dapat diinisialisasi ulang. Menginisialisasi bagian penting yang sudah diinisialisasi menghasilkan perilaku yang tidak terdefinisi.

Jumlah putaran berguna untuk bagian penting dari durasi pendek yang dapat mengalami tingkat pertikaian yang tinggi. Pertimbangkan skenario terburuk, di mana aplikasi pada sistem SMP memiliki dua atau tiga utas yang terus mengalokasikan dan melepaskan memori dari tumpukan. Aplikasi ini menserialisasikan timbunan dengan bagian penting. Dalam skenario terburuk, ketidakcocokan untuk bagian kritis bersifat konstan, dan setiap utas melakukan panggilan intensif pemrosesan ke fungsi WaitForSingleObject . Namun, jika jumlah putaran diatur dengan benar, utas panggilan tidak segera memanggil WaitForSingleObject ketika pertikaian terjadi. Sebaliknya, utas panggilan dapat memperoleh kepemilikan bagian penting jika dirilis selama operasi spin.

Anda dapat meningkatkan performa secara signifikan dengan memilih jumlah putaran kecil untuk bagian penting dalam durasi pendek. Manajer timbunan menggunakan jumlah putar sekitar 4000 untuk bagian kritis per tumpuknya. Ini memberikan performa dan skalabilitas yang hebat dalam hampir semua skenario terburuk.

Persyaratan

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

Lihat juga

Objek Bagian Kritis

DeleteCriticalSection

Api Vertdll tersedia di enklave VBS