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