在此代码中使用memory_order_relaxed是否正确

Is it correct to use memory_order_relaxed at this code?

本文关键字:order relaxed 是否 memory 代码      更新时间:2023-10-16

在以下代码中使用std::memory_order_relaxed是否正确?

#include <atomic>
#include <array>
#include <iostream>
#include <thread>
using namespace std;
int main() {
    std::atomic<int> counter(0);
    constexpr size_t thread_count = 10;
    std::array<std::thread, thread_count> threads;
    for (auto& th : threads) {
        th = std::thread([&counter]() {
            for (int j = 0; j < 100; ++j) {
/*1*/           counter.fetch_add(1, std::memory_order_relaxed);
            }
        });
    }
    for (auto& th : threads) th.join();
/*2*/ std::cout << counter.load(std::memory_order_relaxed) << std::endl;
    return 0;
}

我有一个方法调用计数器。计数器何时实际递增(/*1*/)并不重要,只要递增一段时间就足够了。但是当我调用atomic::load/*2*/)时,所做的所有计数器更改都应该是可见的。

在第 /*1*/ 行和/*2*/行中使用std::memory_order_relaxed是否正确?

是的,这很好。线程连接提供必要的同步点,以确保最终load()看到正确的值。