【问题标题】:Would it be possible to run the same C++ code simultaneously? [duplicate]是否可以同时运行相同的 C++ 代码? [复制]
【发布时间】:2022-01-14 11:34:14
【问题描述】:

假设我编译了一些代码并让它运行。完成需要 10 分钟。

同时,如果我更改代码中的一些参数并使用单独的终端窗口再次编译并运行它(所以现在有两个程序使用相同的代码同时运行),第二次运行是否会影响第一次运行程序作为第一个编译输出被第二个编译输出替换?

【问题讨论】:

  • 除非您构建一个具有不同名称的可执行文件,否则您甚至无法编译第二个。除此之外,除非您使用某种共享内存方法,否则每个人都会获得自己的 RAM 块。
  • 在 Solaris 上,大约在 2003 年,如果您执行 IIRC,它总是会崩溃 ????
  • 在Linux上,旧程序一直运行旧代码,新程序运行新代码。

标签: c++ linux compilation


【解决方案1】:

C++ 标准未定义该行为。一般来说,会发生以下两种情况之一(主要取决于操作系统)

  1. 第二次编译将失败,因为链接器将无法打开可执行文件以对其进行写入。

  2. 编译将成功,并且对原始可执行文件的现有调用将不受影响;以后的调用将使用新的可执行文件。

第三种可能性——编译成功,并扰乱了现有的调用——在现代操作系统中是闻所未闻的。

【讨论】:

  • 编译没有问题。但我不明白第一个程序是如何使用更新的输出文件运行的。
  • user7860670 的评论表明断言“对原始可执行文件的现有调用将不受影响” 是错误的。我其实不知道...
  • 如果他们有具体的证据,我会推迟它......这与我的个人经验或我对加载程序如何将可执行文件映射到内存的理解不符,但我不有确凿的证据支持我的经历。
  • @Sneftel 如果cmake用于构建和编译会有什么不同吗?
  • @Rohit 不,不会。
【解决方案2】:

唯一合理的答案是该行为完全取决于操作系统:C++ 标准没有尝试描述可能发生的情况。

您的操作系统供应商可能会扩展记录或指定行为的常见礼貌,但我从未见过这样的文档。

最好不要尝试。


我是一只老猫,这里有一些沉思。由于文件锁定,您不太可能在 Windows 上执行此操作。在 Sun 工作站上这是可能的,但是一旦您编译到与正在运行的可执行文件相同的位置,该程序似乎根本无法正常运行。嗯,当我在大学使用预标准化的 C++ 时,肯定是这样的。它只是表现得很奇怪,没有任何原因。在 rhel 上,它似乎特别适用于小型程序。

【讨论】:

    【解决方案3】:

    有三种可能的情况:

    1. 在 Windows 上,可执行文件在执行时将被锁定以进行写入和删除,因此构建将失败。

    2. 在 Linux 上,可执行文件在执行时不需要保护其不被修改或删除。

    2.1。如果从文件系统中删除文件,然后创建具有相同名称的新文件,则旧文件内容仍将保留,直到已经运行的可执行文件退出,而新的可执行文件将使用新文件。因此旧的可执行文件将继续正常运行,而新的可执行文件也将准备好工作。

    2.2。如果打开一个文件进行写入并用新内容覆盖,那么已经运行的可执行文件将使用新的机器代码,这很可能与现有程序状态不兼容并导致崩溃。

    【讨论】:

    • 注意:场景 2.2。当您将可执行文件从构建文件夹复制到某个工作文件夹作为构建后步骤时,通常会发生这种情况。因此,必须采取预防措施,并始终尝试在复制新文件之前删除现有文件,以避免随机崩溃。
    • 注意:场景 2.1 也可能存在问题。例如:您想在创建新的可执行文件后调试一些正在运行的可执行文件;您启动 gdb 并执行通常的序列file <executable path><enter>attach <pid><enter> 并且所有这一切突然 gdb 打印出令人困惑的抱怨,可执行文件不匹配并且没有可用的调试符号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多