【问题标题】:IO Service per core design with singleton单例的每个核心设计的 IO 服务
【发布时间】:2014-04-19 10:38:08
【问题描述】:

我目前正在开发游戏服务器,目前我有一个设计问题。

游戏服务器有 World 类(它是单例的),当我从单一 I/O 服务更改为每个核心的 I/O 服务时,我认为我应该在我的 World 类中使用互斥锁。 因为来自客户端的数据包处理程序有时会使用 World 的函数执行操作。

有没有办法避免单例中的互斥锁?

【问题讨论】:

  • 好吧,如果从多个线程中使用,不要使用会破坏事物的代码? :)
  • 实际上,在进入多线程模式之前实例化你的单例是一个很好的做法,在应用程序开始附近的某个地方。然后你应该在确实需要的地方使用锁。如果不了解您的服务逻辑,就很难提出更准确的建议。

标签: c++ singleton boost-asio mutex


【解决方案1】:

您可以使用主动对象模式。

所以让 World 实现成为一个活动对象,实际上在它自己的线程上运行所有操作。

Boost Asio 的主动对象模式示例在这里:boost::asio and Active Object

将 World 设为活动对象是否(在性能方面)合适,我无法判断。我有一种感觉,你应该/简单地/不要从许多线程访问 World,而是只在不需要锁来协调的后台运行计算密集型的东西,或者在锁定开销不重要的地方。

在我的 comment here 中,我展示了一种通过无锁队列实现调度作业的替代方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2022-06-28
    • 2021-03-21
    • 2016-09-11
    • 1970-01-01
    相关资源
    最近更新 更多