Dalam persekitaran berbilang benang, adalah penting untuk melaksanakan keselamatan benang untuk mengelakkan rasuah data. Mekanisme berikut disediakan dalam C++: 1. Kunci Mutex (std::mutex) memastikan bahawa hanya satu utas dibenarkan untuk mengakses data yang dikongsi pada satu-satu masa 2. Pembolehubah keadaan (std::condition_variable) membenarkan utas menunggu untuk sesuatu yang tertentu; syarat menjadi benar; 3. Kunci baca-tulis (std::shared_mutex) membenarkan berbilang utas membaca data yang dikongsi secara serentak, tetapi hanya satu utas boleh menulis. Mekanisme ini memastikan kestabilan dan integriti data program dalam persekitaran berbilang benang dengan menyegerakkan akses kepada sumber yang dikongsi oleh rangkaian yang berbeza.
Pelaksanaan Selamat Benang dalam C++
Pengenalan
Dalam persekitaran berbilang benang, jika berbilang benang mengakses data kongsi pada masa yang sama tanpa penyegerakan data, ia boleh mengakibatkan kerosakan data aplikasi. Untuk mengelakkan masalah sedemikian, kita perlu melaksanakan keselamatan benang.
Mutex Lock
Kunci mutex ialah primitif penyegerakan yang membenarkan hanya satu urutan mengakses bahagian kod atau data tertentu pada satu masa. Dalam C++, anda boleh menggunakan std::mutex
untuk mencipta kunci mutex, seperti yang ditunjukkan di bawah: std::mutex
来创建互斥锁,如下所示:
std::mutex m;
要获取互斥锁,请使用 lock()
方法:
m.lock();
当不再需要时释放互斥锁:
m.unlock();
互斥锁的优点是简单易用,但缺点是如果一个线程长时间持有互斥锁,则其他线程可能需要很长时间才能获得互斥锁。
条件变量
条件变量与互斥锁一起使用,允许线程等待某个条件变为真。在 C++ 中,可以使用 std::condition_variable
来创建条件变量,如下所示:
std::condition_variable cv;
要等待条件变量,请使用 wait()
方法,如下所示:
m.lock(); cv.wait(m); m.unlock();
这将使线程进入休眠状态,直到另一个线程使用 cv.notify_one()
或 cv.notify_all()
唤醒它。
读写锁
读写锁是一种特殊的互斥锁,它允许多个线程同时读取共享数据,但一次只能允许一个线程写入共享数据。在 C++ 中,可以使用 std::shared_mutex
来创建读写锁,如下所示:
std::shared_mutex rw;
要获取读锁,请使用 lock_shared()
方法:
rw.lock_shared();
要获取写锁,请使用 lock()
rw.lock();
lock()
: class BankAccount { std::mutex m; std::condition_variable cv; int balance; public: int get_balance() { m.lock(); int b = balance; m.unlock(); return b; } void deposit(int amount) { m.lock(); balance += amount; cv.notify_all(); m.unlock(); } void withdraw(int amount) { m.lock(); while (balance < amount) { cv.wait(m); } balance -= amount; m.unlock(); } };
Pembolehubah Bersyarat
🎜🎜Pembolehubah bersyarat digunakan dengan kunci mutex untuk membolehkan benang menunggu keadaan tertentu menjadi benar. Dalam C++, anda boleh mencipta pembolehubah keadaan menggunakanstd::condition_variable
seperti yang ditunjukkan di bawah: 🎜rrreee🎜Untuk menunggu pembolehubah syarat, gunakan kaedah wait()
seperti yang ditunjukkan di bawah Menunjukkan: 🎜rrreee🎜Ini akan menyebabkan urutan tidur sehingga urutan lain membangunkannya menggunakan cv.notify_one()
atau cv.notify_all()
. 🎜🎜🎜Kunci baca-tulis🎜🎜🎜Kunci baca-tulis ialah kunci mutex khas yang membenarkan berbilang urutan membaca data yang dikongsi pada masa yang sama, tetapi hanya membenarkan satu urutan menulis data yang dikongsi pada satu-satu masa. Dalam C++, anda boleh menggunakan std::shared_mutex
untuk mencipta kunci baca-tulis seperti berikut: 🎜rrreee🎜Untuk memperoleh kunci baca, gunakan kaedah lock_shared()
: 🎜 rrreee🎜Untuk memperoleh kunci tulis, gunakan kaedah lock()
: 🎜rrreee🎜🎜Contoh praktikal🎜🎜🎜Andaikan kita mempunyai kelas akaun bank yang menjejaki baki akaun: 🎜rrreee🎜Dalam ini contoh , kami menggunakan mutex untuk melindungi pembolehubah baki dan pembolehubah keadaan untuk membenarkan benang menunggu apabila baki tidak mencukupi untuk memenuhi pengeluaran. 🎜Atas ialah kandungan terperinci Bagaimana untuk melaksanakan keselamatan benang dalam C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!