原子操作--atomic
简介
原子操作库
在 C++11 中,std::atomic是一个用于原子操作的类模板。它提供了原子的读-改-写操作,以确保在多线程环境下对共享变量的操作是线程安全的。
std::atomic的主要用途是对共享变量进行原子操作,例如递增、递减、赋值等。它可以用于实现线程安全的数据结构、计数器、信号量等。
下面是一个简单的示例,展示了如何使用std::atomic:
#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> count(0);
void increment()
{
count++;
}
int main()
{
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Count: " << count << std::endl;
return 0;
}
在上面的示例中,我们创建了一个std::atomic<int>类型的变量count,初始值为 0。然后,我们创建了两个线程t1和t2,它们都调用increment函数对count进行递增操作。
由于std::atomic保证了原子性,所以在多线程环境下,count的值将被正确地递增,而不会出现竞态条件或数据不一致的问题。
std::atomic还提供了其他成员函数,例如operator++()、operator--()、operator=()等,用于进行各种原子操作。
成员函数
std::atomic类提供了一些成员函数,用于执行原子操作。这些函数在 C++11 中可用,用于多线程环境下对共享变量进行操作。
以下是std::atomic类的一些常见成员函数:
-
operator++():递增原子变量。 -
operator--():递减原子变量。 -
operator=():赋值原子变量。 -
operator==():比较原子变量与另一个值是否相等。 -
operator!=():比较原子变量与另一个值是否不相等。 -
fetch_add():原子地将一个值添加到原子变量中。 -
fetch_sub():原子地从原子变量中减去一个值。 -
fetch_or():原子地将一个值或操作原子变量的值。 -
fetch_and():原子地将一个值与操作原子变量的值。 -
fetch_xor():原子地异或操作原子变量的值。 -
exchange():原子地交换原子变量的值。 -
compare_exchange_weak():原子地比较并交换原子变量的值(如果相等)。 -
compare_exchange_strong():原子地比较并交换原子变量的值(如果相等),具有更强的顺序保证。
这些成员函数提供了原子性的读-改-写操作,确保在多线程环境下对共享变量的操作是线程安全的。它们避免了竞态条件和数据不一致的问题。
示例:
fetch_add和fetch_or是std::atomic类的成员函数,用于原子地读取并修改原子变量的值。它们提供了一种线程安全的方式来进行读-改-写操作。
以下是使用fetch_add和fetch_or的简单示例:
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> atomicVar(0);
void increment() {
atomicVar.fetch_add(1);
}
void bitwiseOr() {
atomicVar.fetch_or(1 << 2);
}
int main() {
std::thread t1(increment);
std::thread t2(bitwiseOr);
t1.join();
t2.join();
std::cout << "final value of atomicVar: " << atomicVar << std::endl;
return 0;
}
/*
final value of atomicVar: 5
*/
在上面的示例中,我们创建了一个std::atomic<int>类型的变量atomicVar,初始值为 0。
-
increment函数使用fetch_add函数将原子变量的值增加 1。 -
bitwiseOr函数使用fetch_or函数将原子变量的值按位或操作,将第二个参数的值设置为 1。
我们创建了两个线程,一个调用increment函数,另一个调用bitwiseOr函数。两个线程同时对atomicVar进行操作。
最后,我们打印出atomicVar的最终值。由于fetch_add和fetch_or是原子操作,我们可以确保线程安全和正确的操作结果。

浙公网安备 33010602011771号