gpt4 book ai didi

c++ - 直观的线程安全

转载 作者:行者123 更新时间:2023-11-30 02:42:58 25 4
gpt4 key购买 nike

在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com