C++ 在这个代码中使用内存顺序是否正确?

C++ 在这个代码中使用内存顺序是否正确?,c++,c++11,concurrency,atomic,C++,C++11,Concurrency,Atomic,在以下代码中使用std::memory\u order\u released是否正确 #include <atomic> #include <array> #include <iostream> #include <thread> using namespace std; int main() { std::atomic<int> counter(0); constexpr size_t thread_count

在以下代码中使用
std::memory\u order\u released
是否正确

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
std::原子计数器(0);
constexpr size\u t thread\u count=10;
std::数组线程;
用于(自动线程(&T):线程){
th=std::线程([&计数器](){
对于(int j=0;j<100;++j){
/*1*/counter.fetch\u add(1,std::memory\u order\u relaxed);
}
});
}
对于(自动&th:threads)th.join();

/*2*/std::cout是的,这很好。线程连接提供了必要的同步点,以确保最后的
load()
看到正确的值。

谢谢!如果我用
std::this\u线程::sleep\u替换
th.join()
(长时间)
,此代码是否仍然正确?或者我应该至少使用
counter.load(std::memory\u order\u acquire)
?@york.beta:否。您必须有一个同步点,例如释放/获取对(程序本身不会不正确,因为您只访问一个原子变量,但结果是不可预测的。)同样,如果不加入,计数器的状态无论如何都是不可预测的。我对答案有相同的问题和相同的注释。谢谢@Kerrek SB!这里还有另一个问题:计数器会不会。fetch_add(0,std::memory_order_released);读取计数器与通过加入()获得同步点一样理由如下:stackoverflow.com/a/8833218/643011“保证您拥有“最新”值的唯一方法是使用读-修改-写操作,如exchange()、compare_exchange_strong()或fetch_add()但是,同样的,整个问题将是毫无意义的,因为无论多么可能,它都不能保证线程的调度顺序和编写器的真正完成。即使这是一个很长的睡眠时间。