c++ - 对原子变量的非原子操作,反之亦然
问题描述
鉴于以下代码:
static int x;
static void f() {
for (int i = 0; i < 100; ++i)
atomic_fetch_add(&x, 3);
}
此外,假设f
由两个线程同时调用。C/C++ 内存模型是否保证结果总是600
在所有硬件平台上?
如果我将其更改为以下内容怎么办?结果是否仍然保证600
在所有硬件平台上?
static atomic_int a_x;
static void f() {
for (int i = 0; i < 100; ++i)
a_x += 3;
}
或者结果不能保证,我不应该将原子操作与非原子类型混合,反之亦然?
PS:我在这里使用了 int 类型,但我的问题适用于任何类型T
和_Atomic T
.
解决方案
如果要对非原子变量使用原子操作,可以使用std::atomic_ref (C++20)。你可以在这里看到一个例子。
您的第二个示例应该没问题,因为a_x
它是具有memory_order_seq_cst
内存模型的原子,并且+=
被定义为原子操作。
推荐阅读
- loopbackjs - 是否有一种等效的方法可以通过环回以编程方式执行“lb soap”?
- oauth-2.0 - 从授权服务器而不是客户端服务开始的 OAuth 2 进程
- c++11 - C++ Make function unaccessable in the child class
- java - Aspose. Apply horizontal alignment for Range of Cells in Excel Documnet
- image-processing - 对象大小与深度图的关系
- javascript - use angular component function as callback in settings object
- asp.net-mvc - Ajax 表单中未显示 MVC AddModelError 自定义错误
- python - 自动化 Abaqus 运行脚本的 Python 代码
- android - Schedule tasks for later
- azure - 使用部署详细信息克隆 Azure 资源组?