Rumah >pembangunan bahagian belakang >C++ >Manakah Pendekatan Optimum untuk Menambah Pembilang Integer Dikongsi Merentas Berbilang Benang: `kunci`, `Saling berkunci` atau `mudah meruap`?
Interlocked
operasi, lock
pernyataan dan volatile
medan
Soalan:
Andaikan kelas mengandungi medan pembilang int
awam jenis yang diakses oleh berbilang urutan dan hanya menambah atau mengurangkannya. Kaedah manakah cara terbaik untuk menambah medan ini dan mengapa?
lock(this.locker) this.counter ;
Interlocked.Increment(ref this.counter);
public volatile
. Jawapan:
Paling teruk (tidak boleh dilaksanakan):
public volatile
Hanya menggunakan medan volatile
tidak menjamin keselamatan benang. Walaupun volatile
memastikan berbilang CPU mengakses data yang sama secara serentak, ia tidak menghalang interleaving operasi baca dan tulis, yang boleh membawa kepada ralat.
Kedua terbaik:
lock(this.locker) this.counter ;
lock
menyediakan keselamatan urutan dengan menghalang urutan lain daripada melaksanakan kod yang mengubah suai medan yang dilindungi. Walau bagaimanapun, penguncian agak perlahan dan mungkin menyekat benang lain tanpa perlu.
Terbaik:
Interlocked.Increment(ref this.counter);
Interlocked
Operasi adalah atom dan selamat benang, menyediakan kaedah yang paling cekap dan boleh dipercayai untuk mengubah suai data kongsi. Mereka melakukan operasi baca, kenaikan dan tulis dalam satu operasi tanpa mengunci.
Interlocked
berbanding dengan medan volatile
:
Interlocked
menggunakan pagar penuh di sekeliling arahan yang dilaksanakan, menghalang beberapa susunan semula CPU. volatile
padang hanya mempunyai separuh pagar yang diletakkan di sekeliling operasi mereka, jadi ia tidak menghalang penyusunan semula. Oleh itu, untuk pengubahsuaian serentak data dikongsi, operasi Interlocked
harus digunakan manakala untuk senario di mana penulis tidak pernah membaca dan pembaca tidak pernah menulis nilai atom, medan volatile
adalah sesuai.
Atas ialah kandungan terperinci Manakah Pendekatan Optimum untuk Menambah Pembilang Integer Dikongsi Merentas Berbilang Benang: `kunci`, `Saling berkunci` atau `mudah meruap`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!