Rumah >pembangunan bahagian belakang >C++ >Manakah Pendekatan Optimum untuk Menambah Pembilang Integer Dikongsi Merentas Berbilang Benang: `kunci`, `Saling berkunci` atau `mudah meruap`?

Manakah Pendekatan Optimum untuk Menambah Pembilang Integer Dikongsi Merentas Berbilang Benang: `kunci`, `Saling berkunci` atau `mudah meruap`?

Linda Hamilton
Linda Hamiltonasal
2025-01-27 10:51:13408semak imbas

Which is the Optimal Approach for Incrementing a Shared Integer Counter Across Multiple Threads: `lock`, `Interlocked`, or `volatile`?

Perbandingan

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);
  • Tukar pengubah suai akses kaunter kepada public volatile.

Jawapan:

Paling teruk (tidak boleh dilaksanakan):

  • Tukar pengubah suai akses kaunter kepada 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 ;
Pernyataan

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.

Operasi

Interlocked berbanding dengan medan volatile:

Operasi

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn