直观的螺纹安全性

Intuitive thread safety

本文关键字:安全性 直观      更新时间:2023-10-16

在我的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这可能会简化许多已经很简单的问题,但并不是一个包罗万象的答案。