您好,登錄后才能下訂單哦!
C++ 標準庫中的線程同步庫提供了一組原語,用于在多線程環境中實現數據共享和保護
std::mutex
是 C++ 中最基本的同步原語之一。它提供了一種方法來保護共享數據,以防止多個線程同時訪問。當一個線程鎖定互斥鎖時,其他試圖鎖定該互斥鎖的線程將被阻塞,直到鎖被解鎖。
示例:
#include<iostream>
#include<thread>
#include <mutex>
std::mutex mtx; // 全局互斥鎖
int shared_data = 0; // 共享數據
void thread_function() {
std::unique_lock<std::mutex> lock(mtx); // 鎖定互斥鎖
++shared_data; // 修改共享數據
lock.unlock(); // 解鎖互斥鎖
}
int main() {
std::thread t1(thread_function);
std::thread t2(thread_function);
t1.join();
t2.join();
std::cout << "Shared data: "<< shared_data<< std::endl;
return 0;
}
std::recursive_mutex
類似于 std::mutex
,但允許同一線程多次鎖定相同的互斥鎖。這在某些情況下可能很有用,例如在遞歸函數中保護共享數據。
std::chrono
是 C++ 中處理時間的庫,它提供了高精度時間測量和時間點操作。這對于實現超時鎖定和定時任務非常有用。
std::condition_variable
是一個同步原語,允許一個或多個線程等待某個條件成立。當條件成立時,線程將被喚醒并繼續執行。條件變量通常與互斥鎖一起使用,以確保線程安全地訪問共享數據。
示例:
#include<iostream>
#include<thread>
#include <mutex>
#include<condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false; // 共享數據
void print_id() {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) { // 如果 ready 為 false,則等待
cv.wait(lck); // 當前線程被阻塞,并釋放鎖
}
std::cout << "Thread "<< std::this_thread::get_id() << " is ready\n";
}
void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true; // 修改共享數據
cv.notify_all(); // 喚醒所有等待的線程
}
int main() {
std::thread threads[10];
for (auto &th : threads) {
th = std::thread(print_id);
}
std::this_thread::sleep_for(std::chrono::seconds(1));
go(); // 修改 ready 并喚醒所有線程
for (auto &th : threads) {
th.join();
}
return 0;
}
std::shared_mutex
是一種特殊類型的互斥鎖,允許多個線程同時讀取共享數據,但只允許一個線程寫入。這在讀操作遠多于寫操作的場景中非常有用,因為它可以提高性能。
std::atomic
是一種特殊類型的變量,支持無鎖編程。原子操作是不可分割的,這意味著它們在多線程環境中是線程安全的。原子操作通常比使用互斥鎖更高效,但它們的功能有限,只支持基本的算術和邏輯操作。
C++11 引入了 thread_local
關鍵字,用于聲明線程局部變量。線程局部變量在每個線程中都有自己的實例,因此它們不需要同步。這可以用于存儲每個線程的狀態信息或緩存數據。
總之,C++ 標準庫提供了一組強大的同步原語,可以幫助開發人員在多線程環境中實現高效、安全的數據共享和保護。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。