libstdc++ 中 std:shared_ptr 的原子交换如何正确
How is atomic exchange of std:shared_ptr in libstdc++ correct
基于 libstdc++ 的原子交换实现 (https://gcc.gnu.org/ml/libstdc++/2014-10/msg00154.html):
看起来静态分配了 16 个互斥量。当需要进行原子交换时,交换代码将要交换的 2 个指针散列到这些静态互斥体、锁和交换中的一个(或两个)。但是,如果 shared_ptr 在线程之间共享并且被并发访问,互斥锁如何帮助保证并发访问和修改的同步?我猜代码假定内部原始指针正确对齐,但这是 x86 规则,而不是 C++ 保证。我错过了什么使交换成为原子的和正确的,而无需为底层原始指针的每次读取额外锁定?
libstdc++ 不必在每个 平台上工作。它只需要在它工作的平台上工作。
在它无法运行的平台上,它不是标准库的实现。使用不同的。
只要安装和"using"(将其连接到编译器环境)libstdc++(编译器维护者通常)在使用前检查他们的平台假设,这里就没有问题。
通常,您无法以完全独立于平台的方式实现 std
库。您甚至无法以独立于编译器的方式实现它,因为如果没有 std
库支持,某些 std
需要做的事情无法在 C++ 中完成。
atomic_*
函数彼此之间仅是原子的。换句话说,同时访问被 atomic_exchange
修改的 shared_ptr
的唯一有效方法是通过 atomic_load
,它将采用相同的互斥体(基于 shared_ptr
的地址)并阻塞直到 atomic_exchange
完成。
基于 libstdc++ 的原子交换实现 (https://gcc.gnu.org/ml/libstdc++/2014-10/msg00154.html):
看起来静态分配了 16 个互斥量。当需要进行原子交换时,交换代码将要交换的 2 个指针散列到这些静态互斥体、锁和交换中的一个(或两个)。但是,如果 shared_ptr 在线程之间共享并且被并发访问,互斥锁如何帮助保证并发访问和修改的同步?我猜代码假定内部原始指针正确对齐,但这是 x86 规则,而不是 C++ 保证。我错过了什么使交换成为原子的和正确的,而无需为底层原始指针的每次读取额外锁定?
libstdc++ 不必在每个 平台上工作。它只需要在它工作的平台上工作。
在它无法运行的平台上,它不是标准库的实现。使用不同的。
只要安装和"using"(将其连接到编译器环境)libstdc++(编译器维护者通常)在使用前检查他们的平台假设,这里就没有问题。
通常,您无法以完全独立于平台的方式实现 std
库。您甚至无法以独立于编译器的方式实现它,因为如果没有 std
库支持,某些 std
需要做的事情无法在 C++ 中完成。
atomic_*
函数彼此之间仅是原子的。换句话说,同时访问被 atomic_exchange
修改的 shared_ptr
的唯一有效方法是通过 atomic_load
,它将采用相同的互斥体(基于 shared_ptr
的地址)并阻塞直到 atomic_exchange
完成。