原子操作--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
是原子操作,我们可以确保线程安全和正确的操作结果。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)