c++ - 在没有任何锁的情况下加入另一个线程后是否需要内存防护?

标签 c++ multithreading c++11

我想知道如果我想立即读取从该线程存储的值,是否需要在线程连接后放置内存屏障。线程连接是否已经暗示了内存屏障?

vector<int> v(1 << 21);

thread th([&]() {
    for (int i = 0; i < (1 << 20); i++) {
        v[i] = i * 123; // store some kind of calculation results into the vector
    }
});

for (int i = (1 << 20); i < (1 << 21); i++) {
    v[i] = i * 123;
}

th.join();

// Is any memory fence needed to be here?

// use the values from another thread... 
printf("%d\n", v[1234]);
// ...

最佳答案

不需要。不需要内存围栏,因为thread::join会阻塞,直到执行线程完成执行为止。另外,运行循环后,连接操作由主线程执行。我看不到联接操作后将如何需要隔离墙。

关于c++ - 在没有任何锁的情况下加入另一个线程后是否需要内存防护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59418860/

相关文章:

c++ - 以十六进制或十进制打印到 stdout,一个 std::string 作为字节序列

C++11 与不同类型的随机分布共享相同的函数

c++ - 为什么 CRITICAL_SECTION 性能在 Win8 上变差

c++ - 3D 网格投影到 2D 平面

c++ - 数组:仅将字符串数组的索引传递给 Int 数组的索引以供输出

c++ - 日志库的意义和目的是什么?

c++ - libcudart 和 gcc 的本地构建链接错误的 glibc

java - 当我删除对它的所有引用时,阻塞在 accept() 中的 ServerSocket 实例会发生什么情况?

java - 从不同线程检查时,ConcurrentLinkedQueue 大小返回零

c# - 在线程之间共享局部变量是否安全(通过回调闭包)?