0

我需要编写一个计算密集型程序。所以我需要在计算之前将数据从数据库加载到内存中(以节省每次从数据库中获取数据的时间。

我希望该程序成为一个 Web 服务,并希望许多客户端能够同时运行多个计算。

由于加载数据需要相当多的内存,我希望所有计算都共享相同的数据(全局数据)。

但是,如果两个用户同时调用加载相同的数据,会出现同步问题,当一个已经在加载数据时,第二个又开始加载相同的数据。

我是否需要特别为此做一些线程锁?webservice是否意味着多线程编程?我打算使用 WWS(windows web service),因为我是一名 C++ 程序员,但之前只处理过纯算法,所以这对我来说是新的。

对不起,如果我混淆了你。

非常感谢。

4

2 回答 2

0

要解决您的数据加载问题,请使用单例模式,其中单例将有一个加载方法来检查数据是否已加载。如果没有加载mutex/monitor/etc会被获取,再次检查数据是否加载,如果没有加载数据并设置数据加载标志,释放mutex/monitor/etc。

没有 Web 服务器不必是多线程的。根据管理客户端交互的中间件,应该可以指定按顺序处理所有服务请求。请记住,如果您在多处理器系统上运行,您将只能使用一小部分处理能力。

如果您的服务器不修改任何共享数据,则可能需要很少或不需要同步来获得正确/正确的多线程行为。锁定代码的复杂性将与被修改的共享数据的数量以及对已修改数据的争用程度成正比。

于 2012-06-21T04:39:40.060 回答
0

如果您能够可靠地区分每个客户端,则可以为每个客户端创建一个上下文,并且如果客户端断开连接或在指定时间内保持空闲状态,该上下文可能会过期。

此外,如果您希望允许每个客户端同时执行多个“计算请求”,您需要一种独特的方式来识别每个请求,并在客户端上下文中跟踪它们。例如,如果用户有 1 个处理任务和 2 个排队任务,那么他的上下文同时跟踪 3 个任务,每个任务都有自己的状态(排队、运行和完成)。

为了确定“计算请求”何时完成处理,客户端可以继续轮询您的服务,通知它感兴趣的“计算请求”的唯一标识符。

是否需要锁定,取决于您解决问题所采用的架构。您的“全局数据”是只读的吗?如果是,那么您不需要锁来访问它。否则,您很可能会这样做(仍然取决于这些数据的存储方式)。我建议使用 HTTP Web 服务,并依靠会话(cookie)来跟踪每个用户。但是由于我不知道您的要求,所以这是在黑暗中拍摄。如果您遵循我在此处建议的设计,并且将使用每个连接的线程,那么您将需要每个上下文至少一个锁(假设用户可能同时发送多个请求)和一个锁来保护访问上下文列表。

于 2012-06-11T03:51:28.510 回答