单例的每个核心设计的 IO 服务
Posted
技术标签:
【中文标题】单例的每个核心设计的 IO 服务【英文标题】:IO Service per core design with singleton 【发布时间】:2014-04-19 10:38:08 【问题描述】:我目前正在开发游戏服务器,目前我有一个设计问题。
游戏服务器有 World 类(它是单例的),当我从单一 I/O 服务更改为每个核心的 I/O 服务时,我认为我应该在我的 World 类中使用互斥锁。 因为来自客户端的数据包处理程序有时会使用 World 的函数执行操作。
有没有办法避免单例中的互斥锁?
【问题讨论】:
好吧,如果从多个线程中使用,不要使用会破坏事物的代码? :) 实际上,在进入多线程模式之前实例化你的单例是一个很好的做法,在应用程序开始附近的某个地方。然后你应该在确实需要的地方使用锁。如果不了解您的服务逻辑,就很难提出更准确的建议。 【参考方案1】:您可以使用主动对象模式。
所以让 World 实现成为一个活动对象,实际上在它自己的线程上运行所有操作。
Boost Asio 的主动对象模式示例在这里:boost::asio and Active Object
将 World 设为活动对象是否(在性能方面)合适,我无法判断。我有一种感觉,你应该/简单地/不要从许多线程访问 World,而是只在不需要锁来协调的后台运行计算密集型的东西,或者在锁定开销不重要的地方。
在我的 comment here 中,我展示了一种通过无锁队列实现调度作业的替代方法。
【讨论】:
以上是关于单例的每个核心设计的 IO 服务的主要内容,如果未能解决你的问题,请参考以下文章