2011-03-07 28 views
1

我有一個在Citrix環境中運行的應用程序。應用程序可以由多個用戶在不同的用戶會話中同時運行。在我的應用程序中,我正在寫一個應該在所有用戶會話中互斥的文件。我嘗試了互斥鎖,以避免寫入來自不同用戶會話的文件,但使用互斥鎖失敗,因爲在某些情況下,不同的用戶會話無法檢測到互斥對象是否已創建。在Citrix環境中跨用戶會話相互排斥

可以在任何一個告訴我下面的辦法是更好地實現相互排斥所有的用戶會話:

  1. 使用命名管道: 如果命名管道已經存在,那麼應用程序將等到管得由打開它的應用程序實例關閉。否則,創建命名管道來表示獲取鎖定。
  2. 使用鎖定文件: 在磁盤上創建一個普通文件,以指示當需要完成解鎖時獲取鎖定和刪除。

回答

3

您不需要使用鎖定文件。您可以使用內置的文件系統共享機制。

當通過調用CreateFile()打開該文件,你確定以後嘗試打開與dwShareMode參數文件的共享訪問。例如,將其設置爲0,並且其他進程將無法打開該文件。

+0

謝謝。但是,如果其他進程完成了寫入該文件的任務,我希望稍後打開。基本上互斥 – 2011-03-07 09:17:03

+1

@aJ當一個進程寫完後,它會在文件句柄上調用'CloseHandle',然後再次可用。基本上,文件系統的接口已經爲你實現了互斥。你真的不能試圖以任何其他方式去做! – 2011-03-07 09:19:26

+0

但是該進程必須等到另一個進程調用CloseHandle。操作系統是否支持任何機制來「知道」其他進程何時完成其寫入? – 2011-03-07 09:21:34