当前位置: 首页 > 知识库问答 >
问题:

STD::Atomic到底是什么?

韦寒
2023-03-14

我知道std::atomain<>是一个原子对象。但是原子化到什么程度呢?据我所知,操作可以是原子的。使一个对象原子化到底是什么意思?例如,如果有两个线程同时执行以下代码:

a = a + 12;

那么整个操作(例如add_twelve_to(int))是原子操作吗?还是对变量atomic(sooperator=())进行了更改?

共有1个答案

李泓
2023-03-14

STD::Atomic<>的每个实例化和完全专门化都表示不同线程可以同时操作的类型(它们的实例),而不会引发未定义的行为:

原子类型的对象是唯一没有数据竞争的C++对象;也就是说,如果一个线程写一个原子对象,而另一个线程从中读取,那么行为是定义良好的。

此外,对原子对象的访问可以建立线程间同步,并按照std::memory_order所指定的顺序对非原子内存访问进行排序。

    null

请注意,对于典型的用例,您可能会使用重载算术运算符或它们的另一组:

std::atomic<long> value(0);
value++; //This is an atomic op
value += 5; //And so is this

因为运算符语法不允许指定内存顺序,所以这些操作将使用std::memory_order_seq_cst执行,因为这是C++11中所有原子操作的默认顺序。它保证所有原子操作之间的顺序一致性(总的全局排序)。

然而,在某些情况下,这可能不是必需的(而且没有免费的),所以您可能希望使用更显式的表单:

std::atomic<long> value {0};
value.fetch_add(1, std::memory_order_relaxed); // Atomic, but there are no synchronization or ordering constraints
value.fetch_add(5, std::memory_order_release); // Atomic, performs 'release' operation
a = a + 12;

至于你的评论:

常规的int具有原子加载和存储。用原子<>包装它有什么意义?

您的陈述只适用于为存储和/或加载提供原子性保证的体系结构。有些体系结构不这样做。此外,通常要求必须在word-/dword对齐的地址上执行操作才能原子化std::atomic<>在每个平台上都保证原子化,而不需要额外的要求。而且,它允许您编写如下代码:

void* sharedData = nullptr;
std::atomic<int> ready_flag = 0;

// Thread 1
void produce()
{
    sharedData = generateData();
    ready_flag.store(1, std::memory_order_release);
}

// Thread 2
void consume()
{
    while (ready_flag.load(std::memory_order_acquire) == 0)
    {
        std::this_thread::yield();
    }

    assert(sharedData != nullptr); // will never trigger
    processData(sharedData);
}
    null

具有此内存顺序的存储操作执行释放操作:在此存储之后,当前线程中的任何读写操作都不能重新排序。当前线程中的所有写操作在获取相同原子变量的其他线程中都是可见的

  • shareddata退出循环之后使用,因此在load()from flag之后将返回一个非零值。load()使用std::memory_order_acquireorder:

std::memory_order_acquire

 类似资料:
  • 主要内容:JSP的由来,Servlet与JSP异同点,JSP相对于Servlet的优点JSP(Java Server Pages)是一种动态网页开发技术。JSP 文件就是在传统的 HTML 文件中插入 Java 代码和 JSP 标签,后缀名为 。 JSP 与 PHP、ASP、ASP.NET 等语言类似,都运行在服务端。通常返回给客户端的就是一个 HTML 文件,因此只要有浏览器就能查看 JSP 页面。 JSP 使用 JSP 标签在 HTML 网页中插入 Java 代码,标签通常以

  • 直到我在旧存储库中随机检查 ,我才听说过这个文件,它就是一个我自己没有编辑过也从未见过的文件。我不知道它是如何到达那里的。 似乎很常见 - 主要是如何删除它(例如这里和这里)。 这个文件是什么,是什么创建了它?

  • 基本上,为什么有这个术语? 还有,接口是什么意思?

  • 译者:lhc741 作者:Jeremy Howard,fast.ai。感谢Rachel Thomas和Francisco Ingham的帮助和支持。 我们推荐使用notebook来运行这个教程,而不是脚本,点击这里下载notebook(.ipynb)文件。 Pytorch提供了torch.nn、torch.optim、Dataset和DataLoader这些设计优雅的模块和类以帮助使用者创建和训练

  • 我不知道如何创建以下内容: 我总是得到 /usr/include/c/5.5.0/bits/stl_对。h:139:45:错误:使用已删除的函数'std::atomic::atomic(const std::atomic 我已经试过了 我知道std::atomic是不可复制的,那么你应该如何创建一对呢?难道这不可能吗?