如何在 c++++ 函數(shù)中實(shí)現(xiàn)線(xiàn)程安全的數(shù)據(jù)結(jié)構(gòu)?使用互斥鎖保護(hù)臨界區(qū)(共享數(shù)據(jù))。線(xiàn)程安全的動(dòng)態(tài)數(shù)組示例:使用互斥鎖保護(hù) std::vector 中的數(shù)據(jù)。實(shí)戰(zhàn)案例:線(xiàn)程安全的隊(duì)列,使用互斥鎖和條件變量實(shí)現(xiàn)消息隊(duì)列的線(xiàn)程安全。
如何在 C++ 函數(shù)中實(shí)現(xiàn)線(xiàn)程安全的數(shù)據(jù)結(jié)構(gòu)?
在多線(xiàn)程應(yīng)用程序中,并發(fā)訪(fǎng)問(wèn)共享數(shù)據(jù)可能會(huì)導(dǎo)致競(jìng)態(tài)條件和數(shù)據(jù)損壞。因此,至關(guān)重要的是對(duì)共享的數(shù)據(jù)結(jié)構(gòu)進(jìn)行線(xiàn)程安全,以確保每個(gè)線(xiàn)程都能安全地訪(fǎng)問(wèn)和修改數(shù)據(jù)。
實(shí)現(xiàn)線(xiàn)程安全數(shù)據(jù)結(jié)構(gòu)的一種簡(jiǎn)單方法是使用互斥鎖。互斥鎖是一種同步原語(yǔ),它允許一次只有一個(gè)線(xiàn)程訪(fǎng)問(wèn)臨界區(qū)(共享數(shù)據(jù))。以下代碼示例展示了如何使用互斥鎖保護(hù)動(dòng)態(tài)數(shù)組中的數(shù)據(jù):
#include <mutex> #include <vector> std::mutex m; // 線(xiàn)程安全的動(dòng)態(tài)數(shù)組 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); // ... }
登錄后復(fù)制
此示例中,std::lock_guard
用作 RAII(資源獲取即初始化)封裝,它在進(jìn)入臨界區(qū)時(shí)自動(dòng)獲取互斥鎖,并在退出臨界區(qū)時(shí)自動(dòng)釋放互斥鎖。這確保了在同一時(shí)間只有一個(gè)線(xiàn)程能訪(fǎng)問(wèn) v
向量。
實(shí)戰(zhàn)案例:線(xiàn)程安全的隊(duì)列
假設(shè)我們有一個(gè)多線(xiàn)程應(yīng)用程序,線(xiàn)程需要共享一個(gè)消息隊(duì)列。為了使隊(duì)列線(xiàn)程安全,可以使用互斥鎖和條件變量來(lái)實(shí)現(xiàn):
#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; // ... }
登錄后復(fù)制
在這種情況下,std::condition_variable
用于通知線(xiàn)程隊(duì)列中是否有新的消息。std::unique_lock
用于鎖定和解鎖互斥鎖,同時(shí)還可以通過(guò) cv.wait()
方法使線(xiàn)程進(jìn)入休眠狀態(tài),直到隊(duì)列中有新消息。