C++ 多執行緒同步關鍵概念:互斥鎖:確保臨界區只能由一個執行緒存取。條件變數:執行緒可在特定條件滿足時被喚醒。原子操作:不可中斷的單一 CPU 指令,保證共享變數修改的原子性。
C++ 多執行緒程式設計的關鍵概念:執行緒同步
執行緒同步是多執行緒程式設計中至關重要的一環,它確保多個執行緒可以安全地存取共享資源,避免競爭和資料損壞。以下介紹C++ 中實作執行緒同步的關鍵概念:
互斥鎖:
互斥鎖(mutex)是一種存取控制機制,它允許一次只能有一個執行緒存取臨界區,也就是需要同步存取的程式碼區域。使用互斥鎖可以防止多個執行緒同時修改共享變量,造成資料損壞。
std::mutex mtx; // 定义互斥锁对象 void someFunction() { std::lock_guard<std::mutex> lock(mtx); // 在进入临界区前加锁 // 访问临界区代码 }
條件變數:
條件變數允許執行緒在特定條件滿足時被喚醒。這在協作式多執行緒程式設計中非常有用,例如當一個執行緒在等待另一個執行緒產生資料時。
std::condition_variable cv; // 定义条件变量对象 std::mutex mtx; // 关联的互斥锁对象 void produce() { std::lock_guard<std::mutex> lock(mtx); // 加锁 // 产生数据 cv.notify_all(); // 通知所有等待此条件的线程 } void consume() { std::unique_lock<std::mutex> lock(mtx); // 加锁 cv.wait(lock); // 等待 `produce()` 函数生产数据 // 消费数据 }
原子操作:
原子運算是不可被其他執行緒中斷的單一 CPU 指令,可以確保對共享變數的修改是原子的。
std::atomic<int> count; // 定义原子变量 void incrementCount() { count++; // 原子方式增加 `count` }
實戰案例:
考慮以下多執行緒程式:
std::vector<int> numbers; // 共享的整型数组 void addNumber(int n) { numbers.push_back(n); } int main() { std::thread t1(addNumber, 1); std::thread t2(addNumber, 2); t1.join(); t2.join(); std::cout << "Numbers in the vector: "; for (int n : numbers) { std::cout << n << " "; } std::cout << std::endl; return 0; }
在這個例子中,numbers
陣列是共享資源,多個執行緒可以並發存取。如果不採取同步措施,可能會出現競爭條件,導致資料損壞。
為了安全地存取數組,我們可以使用互斥鎖:
void addNumber(int n) { std::lock_guard<std::mutex> lock(mtx); // 在访问数组前加锁 numbers.push_back(n); }
這樣,一次只能有一個執行緒存取數組,確保資料的完整性。
輸出:
Numbers in the vector: 1 2
以上是C++ 多執行緒程式設計的關鍵概念是如何同步執行緒的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!