c++ - C++20 中的原子智能指针和互斥锁
问题描述
如果我想从多个线程写入/读取一个对象,即使我在 C++11 中使用 shared_pointer,我也必须使用额外的互斥锁来保证线程安全。如果我使用 C++20 中引入的 atomic_shared_pointer,这仍然适用吗?
问候
解决方案
在考虑shared_ptr
.
引用计数的原子性。也就是说,您
shared_ptr
在不同的线程上有两个对象,但它们都访问相同的托管引用计数。当您shared_ptr
在一个线程上复制一个并删除shared_ptr
引用相同引用计数的另一个时会发生什么?shared_ptr
在这些情况下提供对竞争条件的保证。不同实例的引用计数上的数据竞争shared_ptr
永远不会发生。shared_ptr
对象本身的原子性。也就是说,您有一个 被不同线程引用shared_ptr
的对象。一个线程可能想要替换' 的存储对象或其他东西,但此时其他人可能正在访问它。shared_ptr
C++20
atomic<shared_ptr>
处理这种情况。如果对象是,那么您可以通过通常的界面atomic<shared_ptr>
玩这些游戏。atomic
C++11 有许多原子访问器函数可以达到相同的效果,只要所有代码都使用这些访问器。a所指事物的原子性
shared_ptr
。在这种情况下,多个线程可能正在使用多个不同shared_ptr
的对象,但所有这些shared_ptr
对象都指向同一个对象。这些线程想要访问它们所指向的对象。这种原子性完全取决于你。
shared_ptr
的原子性保证是关于对指针的访问,而不是它指向的内容。如果您需要同步访问所指向的内容,则必须自己构建。
推荐阅读
- android - 为什么任务':app:externalNativeBuildClean的执行失败?
- python - Redis 按键对数据库值进行排序
- python - 三重和平方函数无法正确显示
- reactjs - 如何在反应中使用该动作调用中的一些消息恢复redux动作调用
- javascript - 如何正确使用nodejs将嵌套数组中的多条记录发布到mysql表中?
- java - Java改linux fedora + KDE壁纸
- python - 遍历 python 列表并提取在第二个列表中找到的所有匹配字符串
- c - 没有开关盒循环我怎么能做到(例如计数器)
- r - 仅选择包含 R 中具有两列的表的列表的元素
- html - CSS 悬停效果。元素的边框没有被覆盖