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++? 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.
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()
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!