C++ 速度:命名共享内存vs内存映射文件vs普通内存
假设我有一个服务器,在那里连接的客户机不断更新他们的库存 我可以在更新项目后将中的更改保存到数据库中,也可以在客户端离开会话后更新整个清单 如果我使用第一种方法,按照我目前的规格,我不能同时处理所有这些。如果我进行第二次更新,而我的应用程序由于某种原因死亡,则更新永远不会存储在数据库中 我能做些什么来解决这个问题? 我只能提出两种解决方案(都意味着校验和):C++ 速度:命名共享内存vs内存映射文件vs普通内存,c++,windows,sql-server-2008,memory,C++,Windows,Sql Server 2008,Memory,假设我有一个服务器,在那里连接的客户机不断更新他们的库存 我可以在更新项目后将中的更改保存到数据库中,也可以在客户端离开会话后更新整个清单 如果我使用第一种方法,按照我目前的规格,我不能同时处理所有这些。如果我进行第二次更新,而我的应用程序由于某种原因死亡,则更新永远不会存储在数据库中 我能做些什么来解决这个问题? 我只能提出两种解决方案(都意味着校验和): 运行一个辅助应用程序,它只创建一个命名的共享内存。主应用程序将使用此内存来清点所有客户机,如果我的应用程序死机,则辅助应用程序将保持共享内
我的应用程序是用C++和Windows API编写的。这两种方法(内存映射文件和命名共享内存)都使用以下功能:
CreateFileMapping
OpenFileMapping
MapViewOfFile
- 主应用程序将每天更新一次,因此它可能最终得到一个null ptr或其他类似的东西。源代码有点旧,将由多人更新
- 辅助应用程序只创建一次,除非需要,否则永远不会更新。因此,没有理由相信,如果代码编写得很好,将来就不会出现使其崩溃的bug
如果机器坏了怎么办?更新不会被存储。我觉得你担心的是不同类型内存上操作的相对速度,但你需要担心容错性。错误的方法。标准解决方案是将消息队列与事务队列一起使用。使系统能够适应崩溃和断电,消息将保留在队列中,直到您在更新数据库后将其删除。微优化没有用处,它不必比网络和数据库更快。如果应用程序崩溃,它很可能会破坏共享内存的内容。您基本上需要某种类型的事务。如果你试图将其整合在一起,你就可以很好地重新发明数据库(可能很糟糕)。是的,使用输入缓冲区/队列。可以很好地控制来自缓冲区的流,并且应用程序只与队列交互。专注于这个界面。
CreateFileMapping
OpenFileMapping
MapViewOfFile