我需要编写一个计算密集型的程序。所以我需要在进行计算之前将数据从数据库加载到内存中(以节省每次从数据库中获取数据的时间。
我希望该程序是一个Web服务,并希望许多客户能够同时运行多个计算。
由于加载数据需要相当多的内存,我希望所有计算都共享相同的数据(全局数据)。
但是,如果两个用户同时要求加载相同的数据,是否会出现同步问题,当一个用户已加载数据时,第二个开始再次加载相同的数据。
我是否需要为此特别做一些线程锁定? Web服务是否意味着多线程编程?我计划使用WWS(Windows Web服务),因为我是一名C ++程序员,但之前只处理过纯算法,所以这对我来说是新的。
很抱歉,如果我对你感到困惑。
非常感谢。
答案 0 :(得分:0)
如果您能够可靠地区分每个客户端,则可以为每个客户端创建一个上下文,如果客户端在指定的时间内断开连接或保持空闲状态,该上下文可能会过期。
此外,如果您想允许每个客户进行多次"计算请求"同时,您需要一种独特的方法来识别这些请求中的每一个,并在客户端上下文中跟踪它们。例如,如果用户有1个处理任务和2个排队任务,那么他的上下文同时跟踪3个任务,并且每个任务都有自己的状态(排队,运行和完成)。
识别"计算请求"完成处理后,客户端可以轮询您的服务,通知"计算请求的唯一标识符"它对...感兴趣。
是否需要锁定取决于您采用的架构来解决问题。是你的全球数据"只读?如果是,那么您不需要锁来访问它。否则,您最有可能(仍取决于此数据的存储方式)。我建议使用HTTP Web服务,并依靠会话(cookie)来跟踪每个用户。但既然我不了解你的要求,那就是在黑暗中拍摄。如果你遵循我在这里建议的设计,并且将使用每个连接的线程,那么你每个上下文需要至少一个锁(假设用户可以同时发送多个请求)和一个锁来保护访问上下文列表。
答案 1 :(得分:0)
要解决数据加载问题,请使用单例模式,其中单例将具有一个加载方法,该方法将检查数据是否已加载。如果未加载,将获取互斥锁/监视器/等,再次检查数据是否已加载,如果未加载数据并设置数据加载标志,则释放互斥锁/监视器/等。
没有Web服务器不必多线程。根据中间件管理客户端交互的内容,应该可以指定按顺序处理所有服务请求。请记住,如果您在多处理器系统上运行,您将只能使用一小部分处理能力。
如果您的服务器没有修改任何共享数据,则可能需要很少或不需要同步来获得正确/正确的多线程行为。锁定代码的复杂性将与修改的共享数据量以及对已修改数据的争用程度成正比。