InitializeCriticalSectionAndSpinCount (synchapi.h)

Menginisialisasi objek bagian penting dan mengatur jumlah putar untuk bagian penting. Ketika utas mencoba memperoleh bagian penting yang dikunci, utas berputar: alur memasuki perulangan yang mengulang waktu jumlah putaran, memeriksa apakah kunci dilepaskan. Jika kunci tidak dilepaskan sebelum perulangan selesai, utas akan tidur untuk menunggu kunci dilepaskan.

Sintaks

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

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 penting tidak tersedia, utas 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.

Menampilkan nilai

Fungsi ini selalu berhasil dan mengembalikan nilai bukan nol.

Windows Server 2003 dan Windows XP: 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. Dimulai dengan Windows Vista, fungsi InitializeCriticalSectionAndSpinCount selalu berhasil, bahkan dalam situasi memori rendah.

Keterangan

Utas dari satu proses dapat menggunakan objek bagian penting untuk sinkronisasi pengecualian bersama. Tidak ada jaminan tentang pesanan yang diperoleh utas kepemilikan dari bagian penting. 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. Misalnya, manajer timbunan menggunakan jumlah putar sekitar 4.000 untuk bagian kritis per heap.

Untuk mengkompilasi aplikasi yang menggunakan fungsi ini, tentukan _WIN32_WINNT sebagai 0x0403 atau yang lebih baru. Untuk informasi selengkapnya, lihat Menggunakan Header Windows.

Contoh

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

Persyaratan

   
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

InitializeCriticalSectionEx

SetCriticalSectionSpinCount

Fungsi Sinkronisasi

WaitForSingleObject

Api Vertdll tersedia di enklave VBS