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, […]