- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 3D 游戏项目中尝试并发后,我开始怀疑是否有可能以一种直观、干净和隐式的方式实现线程安全(如果可能的话)。我不喜欢仅仅为了访问资源而必须显式锁定/解锁互斥锁——我更喜欢一个完全隐藏在实际执行工作的代码之外的解决方案。在 C++11 中是否有任何设计模式或结构允许这样做?
下面详细说明了我希望实现此功能的情况的具体示例。
第 1 类:具有共享资源(std::unordered_map
),其中包含 std::shared_ptr
到第 3 类实例。此类访问这些共享资源。
第 2 类:有一个在它自己的线程中运行的函数。此函数从 Class 1 访问共享资源(包括访问 Class 3 实例)。
第三类:该类的函数被两个线程访问。任何一个线程都可以读/写。
有什么建议吗?也许这里真正的问题更有可能是我的设计使线程安全变得不切实际?
最佳答案
有大量的并发模式和习语。没有什么比这更通用的了,你可以忘记所有的同步,只有一个异常(exception):不可变数据类型。如果没有任何东西写入一个值,那么线程就不需要同步它们的访问,因为只有当有人正在写入时,你才能进行数据竞争。
这包括引用计数。如果您在值类型中使用引用计数的 pimpl 实现,则必须在构造和删除时写入引用计数。大多数情况下,这是通过原子操作完成的,这些操作比互斥锁或信号量更快,但也有它们自己的问题。
有复制/修改/交换。从不可变的共享值复制数据。修改拷贝。交换不可变值。留意 ABA 问题。
有消息传递而不是使用共享数据。
最后(正是我脑海中突然想到的)将共享值包装到一个对象中,该对象使用一些代理魔法为您完成大部分同步工作。 Facebook 在他们的愚蠢库中发布了一个:https://github.com/facebook/folly/blob/master/folly/docs/Synchronized.md这可能会简化很多本来就很简单的问题,但并不是万能的答案。
关于c++ - 直观的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26572299/
我是一名优秀的程序员,十分优秀!