在 C++ 多執行緒程式設計中,使用 mutex 和條件變數可以有效率地管理共享資源,避免資料競爭和死鎖:互斥量 (Mutex) 允許一次只允許一個執行緒存取資源,保證資料完整性。條件變數 (Condition Variable) 用於協調執行緒協作,允許一個執行緒等待另一個執行緒執行特定動作。在實戰案例中,生產者執行緒向緩衝區添加數據並通知消費者,消費者執行緒等待生產者通知後從緩衝區讀取數據,透過互斥量和條件變數確保執行緒安全存取共享資源。
C++ 多執行緒程式設計:高效管理共享資源
在多執行緒程式設計中,共享資源的存取控制至關重要。本文將說明如何在 C++ 中使用 mutex 和條件變數等同步原語來有效率地管理共享資源,避免資料競爭和死鎖。
互斥量 (Mutex)
互斥量是保護共享資源免於同時存取的關鍵機制。它允許一次只允許一個執行緒存取資源,從而保證資料完整性。
std::mutex m; // 创建一个互斥量 void access_resource() { std::lock_guard<std::mutex> lock(m); // 加锁 // 对共享资源执行操作 lock.unlock(); // 解锁 }
條件變數 (Condition Variable)
條件變數用於協調執行緒協作。它允許一個線程等待另一個線程執行特定動作。
std::condition_variable cv; // 创建一个条件变量 std::mutex m; // 创建一个与条件变量关联的互斥量 void produce() { std::unique_lock<std::mutex> lock(m); // 生产数据 lock.unlock(); cv.notify_one(); // 通知消费者生产完成 } void consume() { std::unique_lock<std::mutex> lock(m); // 等待生产者通知 cv.wait(lock); // 消费数据 lock.unlock(); }
實戰案例
以下是使用 mutex 和條件變數管理共享資源的簡單範例。它使用一個緩衝區來儲存數據,生產者執行緒往緩衝區添加數據,而消費者執行緒則從緩衝區讀取數據。
#include <mutex> #include <condition_variable> #include <thread> #include <vector> std::mutex m; std::condition_variable cv; std::vector<int> buffer; // 共享资源缓冲区 void produce() { while (true) { std::lock_guard<std::mutex> lock(m); buffer.push_back(rand()); cv.notify_one(); } } void consume() { while (true) { std::unique_lock<std::mutex> lock(m); cv.wait(lock, [] { return !buffer.empty(); }); int data = buffer.back(); buffer.pop_back(); } } int main() { std::thread t1(produce); std::thread t2(consume); t1.join(); t2.join(); return 0; }
透過使用 mutex 和條件變量,我們確保了生產者和消費者執行緒可以同時存取緩衝區,但不會出現資料競爭。
以上是C++ 多執行緒程式設計中如何有效率地管理共享資源?的詳細內容。更多資訊請關注PHP中文網其他相關文章!