2011-04-25 102 views
0

一旦創建了一個程序的目標文件,如果我在不同的輸入數據集上只運行一個或多個實例,那麼這很重要嗎?與這些運行相對應的輸出可能是相互關聯的嗎?在兩個不同的輸入數據集上運行兩個相同的C/C++程序的實例

至於 新手

+4

你的意思是可執行文件?是的,您可以同時運行多個實例。你需要明確的代碼來禁止這種行爲。 – SuperSaiyan 2011-04-25 04:42:27

+0

要添加到Thrustmaster的評論,輸出不相關。代碼執行獨立發生。 – 2011-04-25 04:43:43

+0

當然,除非兩個實例以某種方式相互作用。 – 2011-04-25 04:46:49

回答

2

對於一個設計合理的方案,有多個併發實例應該罰款。每個進程都與其他所有進程分開,具有自己的地址空間,自己的文件描述符以及所有其他資源的一部分。只要輸出文件是分開的,所有的都應該像它們自己一樣並行工作 - 唯一的例外可能是執行時間。

也就是說,基於所使用的資源和系統服務存在例外情況。其中一些是相對良性的,因爲如果代碼在分配資源時執行所需的狀態檢查,那麼程序會錯誤地顯示錯誤消息。例如:

  • 正在偵聽網絡端口:多個進程無法偵聽同一接口上的相同協議端口。即如果一個實例正在偵聽tcp/80,則其他實例不能執行相同的操作。

  • 寫入鎖定相同的文件。

其他可能導致你的程序巧妙地失敗,可能與這兩個進程產生不正確的輸出或做錯事。例如:

  • 訪問與每個進程相同的文件,假設它是該文件的唯一編寫者。對於使用硬編碼臨時文件名的程序尤其常見。輸出文件也是常見的受害者。

  • 按名稱搜索進程表 - 有多個實例可能會導致關於哪個進程是請求進程的混淆。這是一個設計錯誤的服務控制程序和腳本的常見錯誤,它們會高興地殺死錯誤的服務器實例。

  • UI混淆:如果您有通知托盤小程序,它屬於哪個進程?托盤中可能存在兩個相同小程序的實例嗎?哪一個屬於哪個進程?

  • 消息傳遞:根據操作系統和正在使用的消息傳遞方法,如果程序使用硬編碼ID設置偵聽器,則手頭可能會混亂。

有大約一百萬種不同的方式,兩個進程可能導致對方失敗。每次您使用外部資源時,您都應該花時間考慮如果第二個程序要求使用相同資源會發生什麼情況。如果你幸運的話,你將有一個很好的狀態代碼來告訴你 - 在其他情況下,你可能不得不明確保護你的程序。

如果一個程序不能處理多個實例,將此限制徹底記錄下來然後使用鎖定代碼來防止多個實例啓動。

+0

感謝您的詳細回覆。你是對的,我們應該在運行多個實例時考慮這些因素。 – Richeek 2011-04-27 04:17:12

相關問題