Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk melaksanakan struktur data selamat benang dalam fungsi C++?

Bagaimana untuk melaksanakan struktur data selamat benang dalam fungsi C++?

王林
王林asal
2024-04-27 08:33:02814semak imbas

Bagaimana untuk melaksanakan struktur data selamat benang dalam fungsi C++? Gunakan kunci mutex untuk melindungi bahagian kritikal (data kongsi). Contoh tatasusunan dinamik selamat benang: menggunakan mutex untuk melindungi data dalam std::vector. Kes praktikal: baris gilir selamat benang, menggunakan kunci mutex dan pembolehubah keadaan untuk mencapai keselamatan baris gilir mesej.

如何在 C++ 函数中实现线程安全的数据结构?

Bagaimana untuk melaksanakan struktur data selamat benang dalam fungsi C++?

Dalam aplikasi berbilang benang, akses serentak kepada data yang dikongsi boleh membawa kepada keadaan perlumbaan dan rasuah data. Oleh itu, adalah penting untuk menjadikan struktur data yang dikongsi selamat untuk benang untuk memastikan setiap rangkaian boleh mengakses dan mengubah suai data dengan selamat.

Cara mudah untuk melaksanakan struktur data selamat benang ialah menggunakan kunci mutex. Mutex ialah primitif penyegerakan yang membenarkan hanya satu utas untuk mengakses bahagian kritikal (data kongsi) pada satu masa. Contoh kod berikut menunjukkan cara menggunakan mutex untuk melindungi data dalam tatasusunan dinamik:

#include <mutex>
#include <vector>

std::mutex m;

// 线程安全的动态数组
class ThreadSafeVector {
public:
    void push_back(int value) {
        std::lock_guard<std::mutex> lock(m);
        v.push_back(value);
    }
    
    int get(size_t index) {
        std::lock_guard<std::mutex> lock(m);
        return v[index];
    }

private:
    std::vector<int> v;
};

int main() {
    ThreadSafeVector v;
    v.push_back(1);
    int value = v.get(0);
    // ...
}

Dalam contoh ini, std::lock_guard digunakan sebagai pembalut RAII (pemerolehan sumber iaitu permulaan), yang digunakan apabila memasuki kritikal Dapatkan kunci mutex secara automatik apabila keluar dari bahagian kritikal, dan lepaskan kunci mutex secara automatik apabila keluar dari bahagian kritikal. Ini memastikan bahawa hanya satu urutan boleh mengakses vektor v pada satu masa. std::lock_guard 用作 RAII(资源获取即初始化)封装,它在进入临界区时自动获取互斥锁,并在退出临界区时自动释放互斥锁。这确保了在同一时间只有一个线程能访问 v 向量。

实战案例:线程安全的队列

假设我们有一个多线程应用程序,线程需要共享一个消息队列。为了使队列线程安全,可以使用互斥锁和条件变量来实现:

#include <mutex>
#include <condition_variable>
#include <queue>

std::mutex m;
std::condition_variable cv;

class ThreadSafeQueue {
public:
    void push(int value) {
        std::lock_guard<std::mutex> lock(m);
        q.push(value);
        cv.notify_one();
    }
    
    int pop() {
        std::unique_lock<std::mutex> lock(m);
        cv.wait(lock, [this]{ return !q.empty(); });
        int value = q.front();
        q.pop();
        return value;
    }

private:
    std::queue<int> q;
};

int main() {
    ThreadSafeQueue q;
    // ...
}

在这种情况下,std::condition_variable 用于通知线程队列中是否有新的消息。std::unique_lock 用于锁定和解锁互斥锁,同时还可以通过 cv.wait()

🎜Kes praktikal: Barisan selamat benang🎜🎜🎜Andaikan kita mempunyai aplikasi berbilang benang dan benang perlu berkongsi baris gilir mesej. Untuk menjadikan benang gilir-selamat, ini boleh dicapai menggunakan mutex dan pembolehubah keadaan: 🎜rrreee🎜 Dalam kes ini, std::condition_variable digunakan untuk memberitahu urutan jika terdapat mesej baharu dalam barisan. std::unique_lock digunakan untuk mengunci dan membuka kunci mutex, dan juga boleh membuat urutan tidur melalui kaedah cv.wait() sehingga terdapat mesej baharu dalam baris gilir. 🎜

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan struktur data selamat benang dalam fungsi C++?. 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