libstdc++ 中 std:shared_ptr 的原子交换如何正确

mat*_*usa 2 c++ gcc g++ libstdc++ c++11

基于 libstdc++ 的原子交换实现(https://gcc.gnu.org/ml/libstdc++/2014-10/msg00154.html):

看起来静态分配了 16 个互斥锁。当需要发生原子交换时,交换代码会将要交换的 2 个指针散列到这些静态互斥锁、锁和交换中的一个(或两个)。但是,如果一个 shared_ptr 在线程之间共享并且正在被并发访问,那么互斥锁如何帮助保证并发访问和修改的同步?我猜代码假定内部原始指针正确对齐,但这是 x86 规则,而不是 C++ 保证。我缺少什么使交换原子性和正确性而无需为底层原始指针的每次读取额外锁定?

Yak*_*ont 5

libstdc++ 不必在每个平台上工作。它只需要在它工作的平台上工作。

在它不工作的平台上,它不是标准库的实现。使用不同的。

只要人们安装和“使用”(将它连接到编译器的环境)libstdc++(编译器维护者通常)在使用它之前检查他们的平台假设,这里就没有问题。

通常,您不能std以完全独立于平台的方式实现库。您甚至无法以独立于编译器的方式实现它,因为std在没有std库支持的情况下,某些需要做的事情无法在 C++ 中完成。