Bagikan melalui


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.)

Bacaan dan tulisan sederhana ke variabel 32-bit yang selaras dengan benar adalah operasi atom. Dengan kata lain, Anda tidak akan berakhir hanya dengan satu bagian dari 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.

Bacaan dan tulisan sederhana ke variabel 64-bit yang diselaraskan dengan benar adalah atomik pada Windows 64-bit. Membaca dan menulis ke nilai 64-bit tidak dijamin atom pada Windows 32-bit. Membaca dan menulis ke variabel dengan ukuran lain tidak dijamin atomik pada platform apa pun.

API Yang Saling Mengunci

Fungsi yang saling mengunci menyediakan mekanisme sederhana untuk menyinkronkan akses ke variabel yang dibagikan oleh beberapa utas. Mereka juga melakukan operasi pada variabel dengan cara 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 atom. Fitur ini berguna dalam sistem operasi multitugas, di mana sistem dapat mengganggu satu eksekusi utas untuk memberikan irisan waktu prosesor ke utas lain. Tanpa sinkronisasi seperti itu, 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 menukar nilai variabel yang ditentukan. FungsiInterlockedExchangeAdd 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 mengunci 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 mengunci menyediakan hambatan 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.

Compiler Intrinsics

Masalah Sinkronisasi dan Multiproscesor