运行多个应用程序实例的问题?

时间:2012-01-31 13:19:48

标签: c++ multiple-instances

我有一个客户端应用程序(C ++,Windows),可以打开套接字,连接到服务器,发出请求,接收响应和通知。它在本地记录和保存首选项。如果我尝试运行此应用程序的多个实例(目前已被阻止)可能会出现什么问题?

4 个答案:

答案 0 :(得分:3)

您是否遇到了一个特别的问题? ie - 当你执行第二个实例时应用程序崩溃了吗?

根据您的描述,如果第二个应用程序

,您可能无法打开可执行文件
  • 尝试打开第一个打开的同一个套接字
  • 尝试打开第一个打开的同一个文件

除此之外,还需要更多细节。

答案 1 :(得分:2)

如果您的应用程序正在打开侦听端口,则只有一个实例可以使用该特定端口。如果应用程序连接到远程主机,操作系统将始终选择下一个可用端口,以便在这种情况下可以并行运行多个实例。

如果所有实例共享相同的日志和/或配置文件,则并行写入可能会破坏这些文件,因此写入操作应受某些同步对象(例如互斥锁)的保护。

答案 2 :(得分:2)

听起来有点像Web浏览器;)

与典型的Web浏览器一样,如果您的应用程序正确实现,您将能够正常运行多个实例。

不幸的是,有一些方法可以破坏实现,例如:

  • 长时间独占锁定日志或配置文件,从而“拖延”其他实例。
  • 只是忽略对文件的并发访问,导致各种可能的损坏。
  • 不仅可以作为客户端,还可以作为服务器,并且可以监听硬编码端口(因此第二个实例在尝试打开同一个端口时会失败)。
  • 错误地将互斥锁声明为“public”(因此在进程之间共享)而不是“private”,从而导致减速并可能出现死锁。
  • 有一个limit for number of GDI handles per session。如果您的应用程序使用过多的句柄,那么一起使用的多个实例可能会达到该限制,即使每个实例都单独遵守10000个每个进程的句柄限制。
  • 是一头CPU(例如通过busy waiting)。现代多核CPU上的一个CPU占用可能会被忽视,但是一旦实例数量超过了另一个故事的CPU内核数量!
  • 记忆犹新。
  • 错误管理用户界面:
    • 使用UI技巧,例如“永远在顶部”的窗口 - 屏幕上的多个这样的窗口同时没有任何乐趣!
    • 错误管理任务栏通知区域(例如,显示每个实例的托盘图标)。技术上会“工作”但是托盘图标数量过多并不令人愉快,特别是如果应用程序没有“常规”任务栏按钮。

Etc等......基本上只要有共享资源(无论是文件系统,网络,CPU,内存,屏幕还是其他),在同时使用它时都必须小心。

答案 3 :(得分:1)

根据问题,我认为你的意思是多个应用程序都不会为日志记录和首选项创建自己的工作区。这会导致一个实例覆盖并访问另一个实例所产生的数据,从而导致不希望的,不可预测的结果。

如果您有权访问应用程序的源代码,我建议扩展应用程序以创建一个名称包含时间戳的文件夹加上用于保存会话数据的randon编号 - 即日志和首选项。这样,多个实例可以在不相互干扰的情况下运行。

但请记住,某些首选项可能最适合全局 - 以节省您每次加载新实例时必须设置首选项。这取决于您的应用程序以及它们对这些全局偏好的作用。

如果您无权访问源,那么多个实例的另一个选项将是虚拟化,在同一台机器上运行操作系统,每个操作系统运行一个应用程序实例。