Volatile Kelas
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Berisi metode untuk melakukan operasi memori volatil.
public ref class Volatile abstract sealed
public static class Volatile
type Volatile = class
Public Class Volatile
- Warisan
-
Volatile
Keterangan
Pada sistem multiprosesor, karena pengoptimalan performa di kompilator atau prosesor, operasi memori reguler mungkin tampak diurutkan ulang ketika beberapa prosesor beroperasi pada memori yang sama. Operasi memori volatil mencegah jenis penyortiran ulang tertentu sehubungan dengan operasi. Operasi penulisan volatil mencegah operasi memori sebelumnya pada utas diurutkan ulang terjadi setelah penulisan volatil. Operasi baca yang mudah menguap mencegah operasi memori di kemudian hari pada utas diurutkan ulang agar terjadi sebelum pembacaan volatil. Operasi ini mungkin melibatkan hambatan memori pada beberapa prosesor, yang dapat memengaruhi performa.
Misalnya, pertimbangkan skenario berikut dengan dua utas dan dua Int32 bidang x dan y yang awalnya nol:
| Utas 1 | Rangkaian 2 |
|---|---|
x = 1; |
int y2 = Volatile.Read(ref y); |
Volatile.Write(ref y, 1); |
int x2 = x; |
Pembacaan dan penulisan yang volatil mencegah penyusunan ulang dua operasi dalam setiap utas, seperti oleh pengkompilasi atau oleh prosesor. Terlepas dari urutan di mana operasi ini benar-benar terjadi pada satu utas relatif terhadap utas lain, bahkan pada sistem multiprosesor di mana utas dapat berjalan pada prosesor yang berbeda, operasi volatil menjamin bahwa utas 2 tidak akan melihat y2 == 1 dan x2 == 0. Pada utas 1 penulisan x harus tampak terjadi sebelum volatil menulis ke y, dan pada utas 2 pembacaan x harus muncul setelah pembacaan volatil dari y. Jadi jika utas y2 == 12 melihat , itu juga harus melihat x2 == 1.
Namun, pertimbangkan skenario yang sama seperti di atas dengan urutan tertentu di mana operasi terjadi:
| Sequence | Utas 1 | Rangkaian 2 |
|---|---|---|
| 1 | x = 1; |
... |
| 2 | Volatile.Write(ref y, 1); |
... |
| 3 | ... |
int y2 = Volatile.Read(ref y); |
| 4 | ... |
int x2 = x; |
Meskipun volatil menulis ke y pada utas 1 terjadi sebelum pembacaan y volatil pada utas 2, utas 2 mungkin masih melihat y2 == 0. Penulisan volatil y tidak menjamin bahwa pembacaan y volatil berikut pada prosesor yang berbeda akan melihat nilai yang diperbarui.
Note
- Pembacaan dan penulisan volatil memastikan bahwa nilai dibaca atau ditulis ke memori dan tidak di-cache (misalnya, dalam register prosesor). Dengan demikian, Anda dapat menggunakan operasi ini untuk menyinkronkan akses ke bidang yang dapat diperbarui oleh utas lain atau dengan perangkat keras.
- Kelas ini Volatile juga menyediakan operasi baca dan tulis untuk beberapa jenis 64-bit seperti Int64 dan Double. Pembacaan dan penulisan volatil pada memori 64-bit seperti itu atomik bahkan pada prosesor 32-bit, tidak seperti bacaan dan tulis biasa.
Operasi memori volatil adalah untuk kasus khusus sinkronisasi, di mana penguncian normal bukanlah alternatif yang dapat diterima. Dalam keadaan normal, pernyataan C# lock, pernyataan Visual Basic SyncLock, dan kelas Monitor memberikan cara term mudah dan paling tidak rentan kesalahan untuk menyinkronkan akses ke data, dan kelas Lazy<T> menyediakan cara sederhana untuk menulis kode inisialisasi malas tanpa secara langsung menggunakan penguncian yang diperiksa ganda.
Metode Volatile.Read dan Volatile.Write mengaktifkan fungsionalitas yang tidak didukung dalam bahasa. Contohnya:
Beberapa bahasa, seperti Visual Basic, tidak mengenali konsep operasi memori volatil. Kelas ini Volatile menyediakan fungsionalitas tersebut dalam bahasa tersebut.
Note
Memanggil salah satu metode ini hanya memengaruhi akses memori tunggal. Untuk memberikan sinkronisasi yang efektif untuk bidang, semua akses ke bidang harus menggunakan Volatile.Read dan Volatile.Write.
Di C#, menggunakan pengubah
volatilepada bidang menjamin bahwa setiap akses ke bidang tersebut adalah operasi memori yang mudah menguap, tetapi pengubahvolatiletidak dapat diterapkan ke elemen array. Metode Volatile.Read dan Volatile.Write dapat digunakan pada elemen array.
Metode
| Nama | Deskripsi |
|---|---|
| Read(Boolean) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(Byte) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(Double) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(Int16) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(Int32) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(Int64) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(IntPtr) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(SByte) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(Single) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(UInt16) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(UInt32) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(UInt64) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read(UIntPtr) |
Membaca nilai bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| Read<T>(T) |
Membaca referensi objek dari bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul setelah metode ini dalam kode, prosesor tidak dapat memindahkannya sebelum metode ini. |
| ReadBarrier() |
Menyinkronkan akses memori sebagai berikut: Prosesor yang menjalankan utas saat ini tidak dapat menyusun ulang instruksi sedaya sehingga memori membaca sebelum panggilan untuk ReadBarrier() dijalankan setelah akses memori yang mengikuti panggilan ke ReadBarrier(). |
| Write(Boolean, Boolean) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(Byte, Byte) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(Double, Double) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(Int16, Int16) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(Int32, Int32) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(Int64, Int64) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(IntPtr, IntPtr) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(SByte, SByte) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(Single, Single) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(UInt16, UInt16) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(UInt32, UInt32) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(UInt64, UInt64) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write(UIntPtr, UIntPtr) |
Menulis nilai yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| Write<T>(T, T) |
Menulis referensi objek yang ditentukan ke bidang yang ditentukan. Pada sistem yang memerlukannya, menyisipkan penghalang memori yang mencegah prosesor menyusun ulang operasi memori sebagai berikut: Jika baca atau tulis muncul sebelum metode ini dalam kode, prosesor tidak dapat memindahkannya setelah metode ini. |
| WriteBarrier() |
Menyinkronkan akses memori sebagai berikut: Prosesor yang menjalankan utas saat ini tidak dapat menyusun ulang instruksi sedaya sehingga memori menulis setelah panggilan untuk WriteBarrier() dijalankan sebelum memori mengakses yang mendahului panggilan ke WriteBarrier(). |