Mengapa menetapkan bendera berhenti menggunakan memory_order_seq_cst, jika anda menyemaknya dengan memory_order_relaxed?

DDD
Lepaskan: 2024-11-11 15:22:03
asal
585 orang telah melayarinya

Why set the stop flag using memory_order_seq_cst, if you check it with memory_order_relaxed?

Mengapa menetapkan bendera berhenti menggunakan memory_order_seq_cst, jika anda menyemaknya dengan memory_order_relaxed?

Dalam video, Herb Sutter, membincangkan tentang penggunaan atom, termasuk contoh di mana benang utama melancarkan benang pekerja. Pekerja menyemak bendera berhenti, dan benang utama akhirnya menetapkan bendera berhenti kepada benar menggunakan memory_order_seq_cst. Sutter menjelaskan bahawa menyemak bendera dengan memory_order_relaxed boleh diterima kerana kelewatan dalam menghentikan benang tidak penting.

Timbul persoalan mengapa bendera henti ditetapkan dengan memory_order_seq_cst dan bukannya memory_order_relaxed.

mo_relaxed baik untuk memuatkan dan menyimpan perhentian flag

Tiada faedah kependaman yang bermakna untuk susunan memori yang lebih kukuh dalam senario ini, walaupun kependaman untuk melihat perubahan kepada bendera berhenti atau keep_running adalah penting.

ISO Piawaian C tidak menyatakan seberapa cepat stor kelihatan atau perkara yang mungkin mempengaruhinya. Ia hanya memerlukan pelaksanaan memastikan bahawa nilai terakhir yang diberikan oleh operasi atom atau penyegerakan kelihatan kepada semua urutan lain dalam tempoh masa yang terhad.

Kependaman antara utas adalah terutamanya isu kualiti pelaksanaan, dengan standard membiarkan perkara terbuka luas. Pelaksanaan C biasa biasanya disusun kepada asm untuk beberapa seni bina dan mendedahkan sifat koheren cache perkakasan, menghasilkan kependaman antara benang yang rendah.

Pada perkakasan sebenar yang menggunakan koheren cache, pesanan memori yang berbeza untuk menyimpan atau memuatkan tidak jadikan kedai kelihatan lebih awal dalam masa nyata. Mereka mengawal sama ada operasi kemudiannya boleh dilihat secara global sementara menunggu kedai menyerahkan daripada penimbal kedai kepada cache L1d.

Pesanan dan halangan yang lebih kuat, tidak menjadikan perkara berlaku lebih awal dalam erti kata yang mutlak. Mereka melambatkan perkara lain sehingga ia dibenarkan berlaku berbanding dengan stor atau memuatkan.

Faedah prestasi menggunakan memory_order_relaxed untuk beban

Menggunakan memory_order_relaxed untuk beban mempunyai faedah prestasi berikut:

  • Mengelakkan menunggu yang tidak perlu untuk semakan selesai, membenarkan lebih banyak keselarian tahap arahan dan tahap memori merentas lelaran gelung apabila beban menghasilkan palsu.
  • Mengelakkan arahan tambahan pada ISA apabila beban perolehan atau SC memerlukan arahan tambahan, seperti sebagai arahan penghalang 2 hala pada beberapa seni bina.

Dalam senario khusus ini, di mana bendera berhenti adalah ditetapkan dengan jarang, kerja terbuang akibat beban palsu adalah minimum. Oleh itu, faedah prestasi menggunakan memory_order_relaxed mengatasi potensi kelemahan.

Atas ialah kandungan terperinci Mengapa menetapkan bendera berhenti menggunakan memory_order_seq_cst, jika anda menyemaknya dengan memory_order_relaxed?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan