直观的螺纹安全性
Intuitive thread safety
在我的3D游戏项目中尝试并发后,我开始怀疑是否有可能以直观、干净和隐含的方式实现线程安全(如果可能的话)。我不喜欢仅仅为了访问资源就必须显式地锁定/解锁互斥对象——我更喜欢一个完全隐藏在实际工作代码之外的解决方案。在C++11中是否有任何设计模式或结构允许这样做?
下面详细介绍了我希望实现这一点的具体情况。
类1:有一个共享资源(一个std::unordered_map
),它包含从std::shared_ptr
到类3的实例。此类访问这些共享资源。
类2:有一个在自己的线程中运行的函数。此函数访问Class 1中的共享资源(包括访问Class 3实例)。
类3:两个线程都可以访问该类的函数。任一线程都可以读/写。
有什么建议吗?也许这里真正的问题更可能是我的设计,它使线程安全不切实际?
有大量的并发模式和习惯用法。然而,没有什么是通用的,你可以忘记所有的同步,只有一个例外:不可变的数据类型。如果没有任何东西写入值,那么线程就不需要同步它们的访问,因为只有当您正在有人正在写入时,您才能进行数据竞争。
这包括引用计数。如果您在值类型中使用引用计数的pimpl实现,则必须在构造和删除时写入引用计数。大多数情况下,这是通过原子操作来完成的,原子操作比互斥锁或信号量更快,但可能会带来自己的问题。
存在复制/修改/交换。从一个不可变的共享值复制数据。修改副本。使用不可变值进行交换。注意ABA问题。
有消息传递而不是使用共享数据。
最后(我能想到的就是),将共享值封装到一个对象中,该对象通过一些代理魔法为您完成大部分同步工作。脸书发布了一个愚蠢的自由:https://github.com/facebook/folly/blob/master/folly/docs/Synchronized.md这可能会简化许多已经很简单的问题,但并不是一个包罗万象的答案。
- 类与私有变量的其他类之间的线程安全性
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 有关图像处理应用程序的硬件和软件安全性的建议
- 易失性sig_atomic_t的内存安全性
- 如何使用OpenDDS 3.13安全性
- 避免使用指针时C++的性能和安全性
- 在内核级别安全性下隐藏文件
- 调用socket.remote_endpoint(提升 asio 库)线程安全性
- 使用对象的生命周期作为设置器的安全性
- 重载新阵列运算符的安全性如何?
- std::lock_guard 似乎提供了线程安全性,尽管作用域块
- C++中向量和列表的非写入成员函数的线程安全性
- 从不同QThread访问QOBject方法的安全性
- C++ 对 32 位和 64 位处理器强制对齐的安全性
- 直观地了解如何在C++中编码 3x3 矩阵梯度
- 线程安全性和静态变量/成员功能
- 界面设计:超载功能的安全性采用字符串和字符阵列
- 是仅使用get或toplown的原始类型的线程安全性的威胁
- 是否有针对跳跃二进制搜索的直观解释
- 直观的螺纹安全性