8得票4回答
并行中的内存屏障。

Microsoft的Parallel.For文档包含以下方法: static void MultiplyMatricesParallel(double[,] matA, double[,] matB, double[,] result) { int matACols = matA.G...

36得票2回答
Java中内存屏障的行为

阅读了更多的博客/文章等后,我对内存屏障前/后的加载/存储行为感到非常困惑。 以下是Doug Lea在他关于JMM的澄清文章中的两个引用,它们都非常直观: 当线程A写入volatile字段f时可见的任何内容,当线程B读取f时变得可见。 请注意,为了正确建立happens-before关系...

18得票2回答
锁语句的内存屏障

最近我了解了关于内存屏障和重排序问题的知识,现在我对此有些困惑。 考虑以下情况:private object _object1 = null; private object _object2 = null; private bool _usingObject1 = false; p...

8得票1回答
与同一原子变量相关的 std::memory_order_relaxed 原子性

cppreference关于内存顺序的文档说: 放松的内存顺序(typical use)通常用于增加计数器,例如std::shared_ptr的引用计数器,因为这只需要原子性而不需要排序或同步(请注意,减少shared_ptr计数器需要使用带有析构函数的acquire-release同步)...

9得票1回答
释放-获取的传递性

就在我以为我对原子操作有了一些掌握时,我看到了另一篇文章。这是来自GCC wiki的摘录,在总体概述下: -Thread 1- -Thread 2- -Thread 3- y.store (20); if (x.load() == 1...

11得票2回答
std::atomic_bool用于取消标志:std::memory_order_relaxed是正确的内存顺序吗?

我有一个读取套接字并生成数据的线程。每次执行操作后,线程会检查一个std::atomic_bool标志以查看是否必须提前退出。 为了取消操作,我将取消标志设置为true,然后调用工作线程对象的join()方法。 线程和取消函数的代码大致如下:std::thread work_thread;...

29得票4回答
使用4个线程的获取/释放语义

我目前正在阅读安东尼·威廉姆斯的《C++ Concurrency in Action》。他的其中一段代码如下,并指出断言z != 0可能会触发。 #include <atomic> #include <thread> #include <assert.h>...

40得票2回答
为什么我需要内存屏障?

C# 4入门经典(强烈推荐)使用以下代码演示MemoryBarrier的概念(假设A和B在不同的线程上运行):class Foo{ int _answer; bool complete; void A(){ _answer = 123; Thread.MemoryB...

12得票1回答
.NET中何时使用lock,何时使用MemoryBarrier?

在.NET中,lock关键字只是对Monitor.Enter和Monitor.Exit的一种语法糖。因此,你可以这样说:lock(locker) { // Do something } 与是相同的Monitor.Enter(locker); try { // Do Something ...

11得票3回答
乱序执行和内存屏障

我知道现代CPU可以乱序执行,但是它们总是按照顺序退役结果,就像维基百科所描述的那样。 "乱序处理器用其他准备好的指令填补这些时间段,然后在最后重新排序结果,使其看起来像正常处理的指令一样。" 现在,在使用多核平台时,需要使用内存栅栏,因为由于乱序执行,这里可能会打印出错误的x值。Proc...