【问题标题】:Problems with running multiple instances of an application?运行应用程序的多个实例时出现问题?
【发布时间】:2012-01-31 13:19:48
【问题描述】:

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

【问题讨论】:

    标签: c++ multiple-instances


    【解决方案1】:

    您是否遇到了特定的问题?即 - 执行第二个实例时应用程序是否崩溃?

    根据您的描述,如果第二个应用程序可能无法打开可执行文件

    • 尝试打开第一次打开的同一个套接字
    • 尝试打开第一次打开的同一个文件

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

    【讨论】:

    • 感谢山姆提供的宝贵信息。我只是想提前发现问题。
    【解决方案2】:

    听起来有点像网络浏览器;)

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

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

    • 长时间独占锁定日志或配置文件,从而“停止”其他实例。
    • 直接忽略对文件的并发访问,会导致各种可能的损坏。
    • 不仅充当客户端,还充当服务器,并侦听硬编码端口(因此第二个实例在尝试打开同一端口时会失败)。
    • 错误地将互斥锁声明为“公共”(因此在进程之间共享)而不是“私有”,从而导致速度变慢并可能出现死锁。
    • 有一个limit for number of GDI handles per session。如果您的应用程序使用过多的句柄,则多个实例一起可能会达到该限制,即使每个实例都单独遵守 10000 个句柄/进程的限制。
    • 做一个 CPU 猪(例如通过busy waiting)。现代多核 CPU 上的一个 CPU 猪可能会被忽视,但一旦实例数量超过 CPU 内核数量,那就是另一回事了!
    • 做个记忆狂。
    • 用户界面管理不善:
      • 使用诸如“始终在顶部”窗口之类的 UI 技巧 - 同时在屏幕上显示多个此类窗口并不好玩!
      • 任务栏通知区域管理不善(例如,为每个实例显示托盘图标)。技术上会“工作”,但托盘图标数量过多并不令人愉快,尤其是在应用程序没有“常规”任务栏按钮的情况下。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        但请记住,最好将某些首选项设置为全局 - 以免您每次加载新实例时都必须设置首选项。这取决于您的应用程序以及它对这些全局首选项的作用。

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

        【讨论】:

        • 感谢您提供宝贵的信息 therobyyouknow。我试图理解如果我尝试运行多个实例可能会遇到的问题,是的日志和配置文件访问将是一个问题。
        猜你喜欢
        • 2011-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-06-03
        • 2021-06-11
        相关资源
        最近更新 更多