在 C++11 中,原子變數(std::atomic)提供了一種線程安全的方式來操作共用變數。下麵是一個簡單的例子,演示了C++11原子變數的用法。 #include <iostream> #include <atomic> #include <thread> std::atomic<int> co ...
在 C++11 中,原子變數(std::atomic)提供了一種線程安全的方式來操作共用變數。下麵是一個簡單的例子,演示了C++11原子變數的用法。
#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> counter(0); // 聲明一個原子整數變數
void incrementCounter(int id, int iterations) {
for (int i = 0; i < iterations; ++i) {
counter++; // 原子操作,無需額外的鎖
}
}
int main() {
const int numThreads = 5;
const int iterationsPerThread = 100000;
std::thread threads[numThreads];
// 啟動多個線程,每個線程增加計數器
for (int i = 0; i < numThreads; ++i) {
threads[i] = std::thread(incrementCounter, i, iterationsPerThread);
}
// 等待所有線程完成
for (int i = 0; i < numThreads; ++i) {
threads[i].join();
}
std::cout << "Final counter value: " << counter << std::endl;
return 0;
}
註意事項:
- 原子性操作: 原子變數提供了原子性操作,避免了多線程同時訪問共用變數時的競爭條件。
- 無鎖: 使用原子變數的操作是無鎖的,因此在高併發的情況下可以獲得更好的性能。
- 適用類型: std::atomic 模板支持多種類型,例如整數、指針等。
- 適用操作: 可以使用各種操作符和成員函數進行原子操作,如 ++, --, +=, -=, =, exchange, compare_exchange_weak 等。
- 記憶體序: 可以指定記憶體序(memory order)來控制操作的同步順序。
原理:
原子變數的實現通常涉及硬體級別的原子操作或使用操作系統提供的原子指令。在多線程環境下,這些操作保證了對變數的操作是原子的,不會被其他線程中斷。在具體的實現中,可能使用了硬體指令(如 x86 的 lock 首碼指令)或者操作系統提供的原子操作函數。
需要註意的是,雖然原子變數提供了一些程度上的線程安全性,但在設計多線程程式時,仍需註意整體的線程安全性,例如避免競爭條件和死鎖。