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++不必在每个平台上工作。 它只需要在它工作的平台上工作。
在它不起作用的平台上,它不是标准库的实现。 使用不同的。
只要人们安装并"使用"(将其连接到编译器的环境(libstdc++(编译器维护者通常是(在使用之前检查他们的平台假设,这里就没有问题。
通常,您无法以完全独立于平台的方式实现std
库。 您甚至无法以独立于编译器的方式实现它,因为如果没有std
库支持,std
需要执行的某些事情无法在C++中完成。
atomic_*
函数彼此之间只是原子函数。换句话说,同时访问被atomic_exchange
修改的shared_ptr
的唯一有效方法是通过atomic_load
,它将采用相同的互斥锁(基于shared_ptr
的地址(并阻止直到atomic_exchange
完成。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- CMake-按正确顺序将项目与C运行时对象文件链接
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 用于访问容器<T>数据成员的正确 API
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何使用用户输入在C++中正确填充2D数组
- node-gyp 在 macOS 上未正确链接库
- C++从另一个类访问公共静态向量的正确方法是什么
- 不正确的比较和交换计数器输出用于快速排序功能
- 当试图交换可变模板类时,如何正确地重载operator=
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 在UNIX中通过recv/send交换数据时,如何正确使用缓冲区
- libstdc++ 中 std:shared_ptr 的原子交换如何正确
- 正确的代码以打印交换的最大值和最小值
- 在QTcpSocket和python套接字之间交换数据的正确方法是什么?
- 运行时检查失败 #2,AND 数组值与输出交换不正确
- 在类之间交换变量的正确方法是什么?
- 如何正确地多次交换std::函数
- 为什么std::swap可以正确交换自定义对象
- 交换工会的正确方式