2012-01-31 76 views
2

我有一個客戶端應用程序(C++,Windows),它打開套接字,連接到服務器,發出請求,接收響應和通知。它在本地執行日誌記錄和保存首選項如果我嘗試運行此應用程序的多個實例(目前可以阻止),那麼會出現什麼問題?運行應用程序的多個實例的問題?

+0

定義「問題」。 – hmjd 2012-01-31 13:22:35

回答

2

聽起來像一個Web瀏覽器一點點;)

像一個典型的Web瀏覽器,如果您的應用程序正確實現,你就可以運行多個實例的罰款。

不幸的是,有辦法把事情弄糟的實現,例如:

  • 長時間獨佔鎖定日誌或配置文件,從而「拖」其他實例。
  • 只是忽略了對文件的併發訪問,導致各種可能的損壞。
  • 法不只是作爲一個客戶端,但作爲服務器,以及,聽一個硬編碼的端口(所以當試圖打開同一端口的第二個實例會失敗)。
  • 錯誤地聲明一個互斥爲「公共」(並因此進程之間共享),而不是「私人」,導致緩慢起伏和可能的死鎖。
  • 有一個limit for number of GDI handles per session。如果應用程序使用過多的句柄,則多個實例一起使用可能會達到該限制,即使每個實例都單獨遵守10000個每句進程句柄限制。
  • 是CPU豬(例如,通過busy waiting)。現代多核CPU上的一個CPU可能會被忽視,但一旦實例的數量超過CPU內核的數量,那就是另一回事了!
  • 成爲記憶豬。
  • Mismanage UI:
    • 使用諸如「總是在頂部」窗口之類的UI技巧 - 同時在屏幕上顯示多個這樣的窗口是沒有趣味的!
    • 失措任務欄通知區域(例如顯示爲每個實例托盤圖標)。在技​​術上「工作」但具有過多數量的托盤圖標並不令人愉快,特別是如果應用程序沒有「常規」任務欄按鈕。

等等...基本上只要有一個共享的資源(無論是文件系統,網絡,CPU,內存,屏幕或其他),必須在同時使用它來拍攝。

+0

感謝寶貴的信息Branko。 – 2012-02-02 06:59:46

3

您是否遇到了特定的問題?即 - 執行第二個實例時應用程序崩潰了嗎?

從你的描述,你可能無法打開可執行文件,如果第二個應用程序

  • 試圖打開同一個插座上的第一次打開
  • 試圖打開同一個文件中第一次打開

除此之外,還需要更多細節。

+0

感謝Sam的寶貴信息。我只是想提前領會問題。 – 2012-02-02 07:02:44

1

通過問題我推測你的意思是說多個應用程序每個都不會爲日誌記錄和首選項創建自己的工作區。這會導致一個實例覆蓋並訪問另一個實例的數據,從而導致不希望的和不可預知的結果。

如果您有權訪問應用程序的源代碼,我建議擴展該應用程序以創建一個名稱包含時間戳和加上randon數字以容納會話數據的文件夾 - 即日誌和首選項。這樣,多個實例可以在不干擾彼此的情況下運行。

但是請記住,有些偏好可能是全球最好的 - 爲了節省您在每次加載新實例時都必須設置偏好。這取決於您的應用程序以及它在做什麼以確定這些全局偏好可能是什麼。

如果您無法訪問源,那麼多個實例的其他選項將通過虛擬化,多個操作系統在同一臺計算機上,每個操作系統運行一個應用程序實例。

+0

感謝您提供有價值的信息。我試圖理解如果我嘗試運行多個實例可能會遇到的問題,並且是的日誌和配置文件訪問會是一個問題。 – 2012-02-02 07:00:30

2

如果您的應用程序打開端口進行偵聽,則只有一個實例可以使用該特定端口。如果應用程序連接到遠程主機,則操作系統將始終選擇下一個可用端口,這樣多個實例可以並行運行。

如果所有實例共享相同的日誌和/或配置文件,並行寫入可能會破壞這些文件,因此寫入操作應受某些同步對象(例如互斥鎖)的保護。

+0

感謝寶貴的有價值的信息。 – 2012-02-02 07:00:54

相關問題