【发布时间】:2012-01-31 13:19:48
【问题描述】:
我有一个客户端应用程序(C++、Windows),它打开套接字、连接到服务器、发出请求、接收响应和通知。它在本地进行日志记录并保存首选项。如果我尝试运行目前被阻止的此应用程序的多个实例,可能会出现什么问题?
【问题讨论】:
我有一个客户端应用程序(C++、Windows),它打开套接字、连接到服务器、发出请求、接收响应和通知。它在本地进行日志记录并保存首选项。如果我尝试运行目前被阻止的此应用程序的多个实例,可能会出现什么问题?
【问题讨论】:
您是否遇到了特定的问题?即 - 执行第二个实例时应用程序是否崩溃?
根据您的描述,如果第二个应用程序可能无法打开可执行文件
除此之外,还需要更多细节。
【讨论】:
听起来有点像网络浏览器;)
与典型的 Web 浏览器一样,如果您的应用程序实现正确,您将能够正常运行多个实例。
不幸的是,有一些方法会破坏实现,例如:
等等...基本上只要有共享资源(文件系统、网络、CPU、内存、屏幕或其他),在同时使用它时必须小心。
【讨论】:
如果您的应用程序正在打开端口进行侦听,则只有一个实例可以使用该特定端口。如果应用程序连接到远程主机,操作系统将始终选择下一个可用端口,以便在这种情况下多个实例可以并行运行。
如果所有实例共享相同的日志和/或配置文件,并行写入可能会损坏这些文件,因此写入操作应受某些同步对象(例如互斥锁)的保护。
【讨论】:
我认为您所说的问题是指多个应用程序每个都不会为日志记录和首选项创建自己的工作区。这将导致一个实例覆盖和访问另一个实例生成的数据,从而导致不希望的和不可预测的结果。
如果您有权访问应用程序的源代码,我建议您扩展应用程序以创建一个文件夹,其名称包含时间戳和随机数来保存会话数据 - 即日志和首选项。这样,多个实例可以运行而不会相互干扰。
但请记住,最好将某些首选项设置为全局 - 以免您每次加载新实例时都必须设置首选项。这取决于您的应用程序以及它对这些全局首选项的作用。
如果您无权访问源,那么多个实例的另一个选项是通过虚拟化,同一台机器上的多个操作系统,每个操作系统运行一个应用程序实例。
【讨论】: