Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运行应用程序的多个实例时出现问题?_C++_Multiple Instances - Fatal编程技术网

C++ 运行应用程序的多个实例时出现问题?

C++ 运行应用程序的多个实例时出现问题?,c++,multiple-instances,C++,Multiple Instances,我有一个客户端应用程序(C++,Windows),它可以打开套接字、连接到服务器、发出请求、接收响应和通知。它进行日志记录并在本地保存首选项。如果我尝试运行此应用程序的多个实例(目前已被阻止),可能会出现什么问题?您是否发现了特定的问题?ie-执行第二个实例时应用程序是否崩溃 根据您的描述,如果第二个应用程序 尝试打开第一个打开的套接字 尝试打开与第一次打开的文件相同的文件 除此之外,还需要更多的细节。关于问题,我想您的意思是,多个应用程序都没有为日志记录和首选项创建自己的工作区。这将导致一

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

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

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

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

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

关于问题,我想您的意思是,多个应用程序都没有为日志记录和首选项创建自己的工作区。这将导致一个实例覆盖并访问另一个实例生成的数据,从而导致不希望的、不可预测的结果

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

但是请记住,某些首选项最好是全局设置的,这样可以避免每次加载新实例时都必须设置首选项。这取决于您的应用程序和它正在做什么,以及这些全局首选项可能是什么


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

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


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

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

与典型的Web浏览器一样,如果应用程序实现正确,则可以很好地运行多个实例

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

  • 以独占方式长时间锁定日志或配置文件,从而“暂停”其他实例
  • 只需忽略对文件的并发访问,就会导致各种可能的损坏
  • 不仅充当客户机,还充当服务器,并侦听硬编码端口(因此第二个实例在尝试打开同一端口时将失败)
  • 错误地将互斥锁声明为“public”(因此在进程之间共享)而不是“private”,这会导致速度减慢并可能导致死锁
  • 有一个问题。如果您的应用程序使用了过多的句柄,那么多个实例组合在一起可能会达到该限制,即使每个实例单独遵守每个进程10000个句柄的限制
  • 成为CPU的霸主(例如通过)。现代多核CPU上的一个CPU占用者可能会在未被注意的情况下通过,但一旦实例数量超过CPU核心数量,那就另当别论了
  • 做一个记忆猪
  • 管理不当的用户界面:
    • 使用UI技巧,例如“始终在顶部”窗口-同时在屏幕上显示多个这样的窗口是没有乐趣的
    • 任务栏通知区域管理不当(例如,为每个实例显示任务栏图标)。从技术上讲,这会“起作用”,但有过多的托盘图标是不愉快的,尤其是当应用程序并没有“常规”任务栏按钮时

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

感谢您提供的宝贵信息。我试图理解如果我尝试运行多个实例可能会遇到的问题,是的,日志和配置文件访问将是一个问题。感谢Sam提供的宝贵信息。我只是想提前理解问题。