Akses Variabel Yang Saling Diblokir
Aplikasi harus menyinkronkan akses ke variabel yang dibagikan oleh beberapa utas. Aplikasi juga harus memastikan bahwa operasi pada variabel ini dilakukan secara atomik (dilakukan secara keseluruhan atau tidak sama sekali.)
Baca dan tulis sederhana ke variabel 32-bit yang selaras dengan benar adalah operasi atomik. Dengan kata lain, Anda tidak akan berakhir hanya dengan satu bagian variabel yang diperbarui; semua bit diperbarui dengan cara atomik. Namun, akses tidak dijamin akan disinkronkan. Jika dua utas membaca dan menulis dari variabel yang sama, Anda tidak dapat menentukan apakah satu utas akan melakukan operasi baca sebelum yang lain melakukan operasi tulisnya.
Baca dan tulis sederhana ke variabel 64-bit yang diselaraskan dengan benar adalah atomik pada Windows 64-bit. Membaca dan menulis ke nilai 64-bit tidak dijamin atomik pada Windows 32-bit. Membaca dan menulis ke variabel dengan ukuran lain tidak dijamin atomik pada platform apa pun.
API Yang Saling Diblokir
Fungsi yang saling terhubung menyediakan mekanisme sederhana untuk menyinkronkan akses ke variabel yang dibagikan oleh beberapa utas. Mereka juga melakukan operasi pada variabel secara atomik. Utas proses yang berbeda dapat menggunakan fungsi-fungsi ini jika variabel berada dalam memori bersama.
Fungsi InterlockedIncrement dan InterlockedDecrement menggabungkan langkah-langkah yang terlibat dalam tahapan atau penurunan variabel ke dalam operasi atomik. Fitur ini berguna dalam sistem operasi multitugas, di mana sistem dapat mengganggu eksekusi satu utas untuk memberikan irisan waktu prosesor ke utas lain. Tanpa sinkronisasi tersebut, dua utas dapat membaca nilai yang sama, menambahnya sebesar 1, dan menyimpan nilai baru untuk peningkatan total 1, bukan 2. Fungsi akses variabel yang saling diblokir melindungi dari kesalahan semacam ini.
Fungsi InterlockedExchange dan InterlockedExchangePointer secara atomik bertukar nilai variabel yang ditentukan. Fungsi InterlockedExchangeAdd menggabungkan dua operasi: menambahkan dua variabel bersama-sama dan menyimpan hasilnya di salah satu variabel.
Fungsi InterlockedCompareExchange, InterlockedCompare64Exchange128, dan InterlockedCompareExchangePointer menggabungkan dua operasi: membandingkan dua nilai dan menyimpan nilai ketiga dalam salah satu variabel, berdasarkan hasil perbandingan.
Fungsi InterlockedAnd, InterlockedOr, dan InterlockedXor secara atomik melakukan operasi AND, OR, dan XOR.
Ada fungsi yang dirancang khusus untuk melakukan akses variabel yang saling diblokir pada nilai dan alamat memori 64-bit, dan dioptimalkan untuk digunakan pada Windows 64-bit. Masing-masing fungsi ini berisi "64" dalam nama; misalnya, InterlockedDecrement64 dan InterlockedCompareExchangeAcquire64.
Sebagian besar fungsi yang saling diblokir menyediakan penghalang memori penuh di semua platform Windows. Ada juga fungsi yang menggabungkan operasi akses variabel interlock dasar dengan semantik pengurutan memori perolehan dan rilis yang didukung oleh prosesor tertentu. Masing-masing fungsi ini berisi kata "Acquire" atau "Release" dalam namanya; misalnya, InterlockedDecrementAcquire dan InterlockedDecrementRelease. Memperoleh semantik memori menentukan bahwa operasi memori yang dilakukan oleh utas saat ini akan terlihat sebelum operasi memori lainnya dicoba. Semantik memori rilis menentukan bahwa operasi memori yang dilakukan oleh utas saat ini akan terlihat setelah semua operasi memori lainnya selesai. Semantik ini memungkinkan Anda untuk memaksa operasi memori dilakukan dalam urutan tertentu. Gunakan memperoleh semantik saat memasuki wilayah yang dilindungi dan melepaskan semantik saat meninggalkannya.
Topik terkait