我们想在我们的商店更换我们目前的POS软件更新系统。目前,我们在we服务器上有一个文件夹,该文件夹托管着注册表每30分钟左右调用一次的脚本。它们传入当前的版本号,服务器返回一个XML响应,其中包含需要更新的任何文件、散列和任何其他相关信息,以便注册器下载更新后的文件。
我们想要一个能够监听UDP数据包的服务,我们发送的UDP数据包可以用来触发更新。这将防止寄存器不必要地轮询更新。我们正在编写一个更新服务器,它将侦听来自计算机的TCP连接,进行身份验证,执行一些日志记录,然后发送已更改文件的更新。我们希望移动到自定义更新服务器,因为我们需要在测试后将POS的版本发布到某些机器上进行试运行,然后再在公司范围内发布它。
我已经编写了处理传入连接的代码,并创建了一个新线程来处理与该客户端的通信,等等,但是我很难以多线程的方式处理文件I/O。
我非常确定,如果一个文件已经在另一个线程中打开,我将不能通过从一个线程打开它来访问它。我不想事先将文件读入内存并将它们保存在threadsafe容器中,因为这会占用大量内存,特别是当我需要为每个线程保留一个副本以避免线程问题时。
要以线程安全的方式从磁盘/内存访问这些文件,而不使用大量内存或导致线程等待其他线程完成这些文件,最好的方法是什么?
编辑:忘记提到我们正在使用C#。
发布于 2010-02-05 06:39:56
如果文件是只读的,则多个线程可以打开该文件。只需正确设置文件模式即可。
如果两个线程试图打开一个文件的读/写句柄,你会得到错误(至少在Windows上)。
发布于 2010-02-05 06:39:29
See C# async IO documentation.
文件是否发生了更改?为什么你不能从单独的线程读取它们呢?通常,您可以在单独的线程中打开一个文件两次。但是不要期望你的读/写是有序的。
如果寄存器错过了更新,会发生什么情况,就像UDP更新通知一样?你可能应该继续投票,至少现在是这样。
听起来像是你在重新发明一个网络服务器...TCP服务器的正确配置是否可以达到相同的效果(TCP连接、日志记录、文件传送)
发布于 2010-02-05 06:43:30
Windows具有您可能感兴趣的TransmitFile函数。这样,你就可以让操作系统为你处理任何缓存。这是一个C调用,但在C++/CLI项目中应该很容易使用。该调用可以使用重叠io异步完成。
这样,Windows缓存管理器读取文件并在套接字上发送数据,而您根本不需要接触数据。该函数用于通过套接字进行高性能的文件数据传输。
只需打开文件,保留缓存文件的句柄(这样您就不需要一次又一次地打开它们),然后调用TransmitFile在连接的套接字上发送它们。您需要在服务器操作系统上运行该功能才能正常工作(客户端操作系统版本对传输有限制)。
https://stackoverflow.com/questions/2203752
复制相似问题