主要观点:在将生命周期规则适配到并发 C++ 时出现了一些问题,包括对象生命周期开始和结束时的内存依赖分析等,涉及编译器优化与内存模型的冲突,需要通过引入来源规则等方式来解决。
关键信息:
- 在并发 C++ 中,“after”的含义变得复杂,可能出现三种情况,如指针传递给释放函数后其他指针的确定性问题。
- 编译器在一些情况下会出现误编译,如早期逃逸和存储在栅栏前的重排序等,且对于这些误编译的正确性存在不同看法。
- 来源规则可作为解决问题的方向,它能让编译器在一定程度上遵循单线程语义进行重排序,同时加强对程序中指针传递的规则。
- 提出了一些测试用例来验证规则的合理性,如早期逃逸、存储在栅栏前等案例,以及一些模糊情况和不同的替代方案。
重要细节: - 在早期逃逸的例子中,由于加载缓冲可能使指针回到对象创建前,导致编译器的常量传播优化错误。
- 在存储在栅栏前的例子中,交换存储和函数调用可能会破坏简单的消息传递与栅栏的顺序。
- 来源规则中,存储创建时会被分配唯一不透明整数作为来源,指针的解引用需要来源匹配,新的临时来源规则可用于解决时间旅行相关问题。
- 替代方案包括让编译器改变、要求使用特定的内存顺序、反向指针 zap 等,但都存在各自的问题。
- 提出了一些关于规则的问题,如早期逃逸和同步加载未同步指针的例子是否应导致未定义行为等。
- 引用了相关的讨论和报告,如 Stephen Dolan 的演讲、LLVM 问题报告等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。