C++ Concurrent Programming: Gunakan kelas atom dan halangan memori untuk memastikan keselamatan concurrency
Dalam persekitaran berbilang benang, pengaturcaraan serentak ialah teknik biasa untuk menangani sumber yang dikongsi. Walau bagaimanapun, jika langkah yang sesuai tidak diambil, akses serentak boleh menyebabkan perlumbaan data dan masalah keterlihatan memori. Untuk menyelesaikan masalah ini, C++ menyediakan kelas atom dan halangan memori.
Kelas Atom
Kelas atom ialah kelas khas yang merangkumi jenis asas, memastikan akses kepada kejadiannya adalah atom walaupun dalam persekitaran berbilang benang. Ini mengelakkan perlumbaan data apabila membaca dan menulis pembolehubah yang dikongsi.
Penghalang Memori
Penghalang ingatan ialah arahan khas yang digunakan untuk memaksa atur cara antara utas yang berbeza. Mereka memastikan bahawa semua capaian memori dilakukan sebelum halangan kelihatan selepas halangan. Empat jenis halangan memori disediakan dalam C++:
memory_order_acquire
:禁止乱序访问,并确保屏障之前的所有写入都对所有线程可见。memory_order_release
:禁止乱序访问,并确保屏障之后的所有读取都会获取之前的所有写入。memory_order_acq_rel
:结合 memory_order_acquire
和 memory_order_release
的功能。memory_order_seq_cst
:最严格的屏障,可确保所有程序顺序。实战案例
考虑以下示例,其中两个线程共享一个计数器:
// 原子计数器 std::atomic<int> counter; void thread1() { // ... counter.fetch_add(1, std::memory_order_release); // ... } void thread2() { // ... int value = counter.load(std::memory_order_acquire); // ... }
在 thread1
中,fetch_add
操作使用 memory_order_release
屏障,确保对 counter
的写入在所有线程中都可见。在 thread2
中,load
操作使用 memory_order_acquire
屏障,确保在读取 counter
之前获取所有以前对 counter
的写入。这消除了数据竞争和内存可见性问题。
注意
内存屏障可能会降低性能。因此,仅在必要时才使用它们。此外,始终使用 std::memory_order_seq_cst
memory_order_release
: Tidak membenarkan akses luar pesanan dan memastikan bahawa semua bacaan selepas halangan akan memperoleh semua penulisan sebelumnya.
memory_order_acq_rel
: Menggabungkan fungsi memory_order_acquire
dan memory_order_release
. 🎜memory_order_seq_cst
: Penghalang paling ketat untuk memastikan semua susunan program. 🎜🎜Kes Praktikal🎜🎜🎜Pertimbangkan contoh berikut di mana dua utas berkongsi pembilang: 🎜rrreee🎜Dalam thread1
, operasi fetch_add
Gunakan halangan memory_order_release
untuk memastikan bahawa penulisan ke counter
kelihatan kepada semua urutan. Dalam thread2
, operasi load
menggunakan penghalang memory_order_acquire
untuk memastikan semua pasangan sebelumnya diperoleh sebelum membaca <code>counter
Penulisan >kaunter. Ini menghapuskan perlumbaan data dan isu keterlihatan memori. 🎜🎜🎜Nota 🎜🎜🎜Halangan ingatan boleh mengurangkan prestasi. Oleh itu, gunakannya hanya apabila perlu. Selain itu, sentiasa gunakan std::memory_order_seq_cst
untuk menjamin keterlihatan memori tertinggi, tetapi ia juga mempunyai overhed prestasi tertinggi. 🎜Atas ialah kandungan terperinci Pengaturcaraan Serentak C++: Bagaimana untuk menggunakan kelas atom dan halangan memori?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!