单例的每个核心设计的 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 服务的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-单例模式下对多例的思考(案例:Server服务器)

spring单例和非单例的问题

设计模式-单例模式

单例模式

java设计模式----单例模式

单例设计模式