Tag: 内存屏障

可以使用C11围栏来推断其他线程的写入吗?

图4b中的Adve和Gharachorloo的报告提供了以下在没有顺序一致性的情况下表现出意外行为的程序示例: 我的问题是,是否有可能只使用C11栅栏和memory_order_relaxed加载和存储来确保register1(如果写入)将被写入值1.抽象中可能难以保证的原因是P1,P2并且P3可以在病理性NUMA网络中的不同点处具有P2在P3之前看到P1的写入的属性,但是不知何故P3看到P2的写入非常快。 特别是对C11规范难以保证的原因是P1写入A和P2的A读取不会相互同步,因此规范的5.1.2.4.26段将导致未定义的行为。 可能我可以通过放松的primefaces提取/存储来回避未定义的行为,但我仍然不知道如何对P3所看到的顺序进行过渡性推理。 下面是一个试图用栅栏解决问题的MWE,但我不确定它是否正确。 我特别担心释放栅栏不够好,因为它不会刷新p1的存储缓冲区,只是p2的。 但是,它会回答我的问题,如果你可以认为断言永远不会失败只是基于C11标准(而不是一些关于特定编译器和架构的其他信息)。 #include #include #include #include atomic_int a = ATOMIC_VAR_INIT(0); atomic_int b = ATOMIC_VAR_INIT(0); void p1(void *_ignored) { atomic_store_explicit(&a, 1, memory_order_relaxed); } void p2(void *_ignored) { if (atomic_load_explicit(&a, memory_order_relaxed)) { atomic_thread_fence(memory_order_release); // not good enough? atomic_store_explicit(&b, 1, memory_order_relaxed); } } void p3(void *_ignored) { int register1 = 1; if (atomic_load_explicit(&b, […]

mutex_unlock是否可用作内存栅栏?

我将描述的情况发生在iPad 4(ARMv7s)上,使用posix libs进行互斥锁定/解锁。 我在其他ARMv7设备上看到过类似的东西(见下文),所以我想任何解决方案都需要更全面地了解ARMv7的互斥锁和内存栅栏的行为。 场景的伪代码: 线程1 – 生成数据: void ProduceFunction() { MutexLock(); int TempProducerIndex = mSharedProducerIndex; // Take a copy of the int member variable for Producers Index mSharedArray[TempProducerIndex++] = NewData; // Copy new Data into array at Temp Index mSharedProducerIndex = TempProducerIndex; // Signal consumer data is ready by assigning new Producer Index to […]

用户空间中的内存障碍? (Linux,x86-64)

在内核端很容易设置内存障碍:由于Linux内核头文件,宏mb,wmb,rmb等总是存在。 如何在用户端完成此操作?