Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk melaksanakan keselamatan benang dalam C++?

Bagaimana untuk melaksanakan keselamatan benang dalam C++?

WBOY
Lepaskan: 2024-06-03 13:36:56
asal
754 orang telah melayarinya

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.

Bagaimana untuk melaksanakan keselamatan benang dalam C++?

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;
Salin selepas log masuk

要获取互斥锁,请使用 lock() 方法:

m.lock();
Salin selepas log masuk

当不再需要时释放互斥锁:

m.unlock();
Salin selepas log masuk

互斥锁的优点是简单易用,但缺点是如果一个线程长时间持有互斥锁,则其他线程可能需要很长时间才能获得互斥锁。

条件变量

条件变量与互斥锁一起使用,允许线程等待某个条件变为真。在 C++ 中,可以使用 std::condition_variable 来创建条件变量,如下所示:

std::condition_variable cv;
Salin selepas log masuk

要等待条件变量,请使用 wait() 方法,如下所示:

m.lock();
cv.wait(m);
m.unlock();
Salin selepas log masuk

这将使线程进入休眠状态,直到另一个线程使用 cv.notify_one()cv.notify_all() 唤醒它。

读写锁

读写锁是一种特殊的互斥锁,它允许多个线程同时读取共享数据,但一次只能允许一个线程写入共享数据。在 C++ 中,可以使用 std::shared_mutex 来创建读写锁,如下所示:

std::shared_mutex rw;
Salin selepas log masuk

要获取读锁,请使用 lock_shared() 方法:

rw.lock_shared();
Salin selepas log masuk

要获取写锁,请使用 lock()

rw.lock();
Salin selepas log masuk

Untuk mendapatkan kunci mutex, gunakan kaedah 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();
    }
};
Salin selepas log masuk
Lepaskan mutex apabila tidak diperlukan lagi: rrreeeKelebihan mutex ialah ia mudah dan senang digunakan, tetapi kelemahannya ialah jika satu benang menahan mutex untuk masa yang lama, ia mungkin mengambil masa yang lama. masa untuk benang lain mendapatkannya kunci Mutex.

Pembolehubah Bersyarat

🎜🎜Pembolehubah bersyarat digunakan dengan kunci mutex untuk membolehkan benang menunggu keadaan tertentu menjadi benar. Dalam C++, anda boleh mencipta pembolehubah keadaan menggunakan std::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!

Label berkaitan:
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