atomic<int> 不可以用等号
时间: 2023-12-17 16:05:19 浏览: 27
`atomic<int>` 是 C++11 中引入的原子类型,它的特点是在多线程环境下保证对该类型变量的操作的原子性。在使用`atomic<int>`类型时,应该使用特定的原子操作函数来对该类型变量进行操作,例如`load()`、`store()`、`exchange()`、`compare_exchange_strong()`等。因为`atomic<int>`类型的变量是原子的,所以不能像普通的变量一样使用赋值操作符`=`来对其进行赋值操作。如果需要对`atomic<int>`类型的变量进行赋值操作,应该使用`store()`函数来实现。例如:
```cpp
#include <atomic>
using namespace std;
atomic<int> a(0);
int main() {
a.store(1);
return 0;
}
```
这里的`store(1)`函数会将`a`的值设为1。
相关问题
atomic<int> 使用示例
下面是一个使用std::atomic<int>的示例:
```c++
#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> counter(0);
void incrementCounter() {
for (int i = 0; i < 1000000; ++i) {
counter++;
}
}
int main() {
std::thread t1(incrementCounter);
std::thread t2(incrementCounter);
t1.join();
t2.join();
std::cout << "Counter value: " << counter << std::endl;
return 0;
}
```
这个示例创建了两个线程,每个线程都会对counter进行1000000次自增操作。由于std::atomic<int>保证了原子性,因此不会出现数据竞争的问题。最终输出的counter值应该是2000000。
std::atomic<int> 举例使用
下面是一个使用 std::atomic<int> 的示例代码:
```cpp
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> counter(0);
void increment_counter() {
for (int i = 0; i < 1000000; ++i) {
++counter; // 自增操作会自动转换为原子操作
}
}
int main() {
std::thread t1(increment_counter);
std::thread t2(increment_counter);
t1.join();
t2.join();
std::cout << "Final counter value is " << counter << std::endl; // 原子地读取计数器的最终值
return 0;
}
```
在这个例子中,我们同样创建了一个 std::atomic<int> 类型的计数器,并在两个线程中并发地对它进行自增操作。由于 std::atomic<int> 已经重载了自增运算符,因此我们可以直接使用 ++counter 进行自增操作,它会自动转换为原子操作。最后,我们同样使用 counter 变量来读取计数器的最终值,并输出到控制台上。