簡體   English   中英

CreateDirectory()在C#中是否是線程安全的?

[英]Is CreateDirectory() in C# thread-safe?

我可以安全地嘗試從兩個不同的線程創建相同的目錄,而不會讓其中一個拋出異常,或遇到其他問題嗎?

請注意,根據MSDN ,可以在已存在的目錄上調用CreateDirectory() ,在這種情況下,該方法不會執行任何操作。

Directory.CreateDirectory調用本身可以安全地從多個線程進行。 如果這樣做,它不會破壞程序或文件系統狀態。

但是,無法以這種方式調用Directory.CreateDirectory以保證它不會拋出異常。 文件系統是一個不可預測的野獸,可以在任何給定時間由您控制之外的其他程序更改。 例如,很可能看到以下情況發生

  • 程序1線程1:為c:\\temp\\foo調用CreateDirectory並成功
  • 程序2線程1:從程序1用戶中刪除對c:\\temp訪問權限
  • 程序1線程2:調用CreateDirectory並因訪問不足而拋出

簡而言之,您必須假設Directory.CreateDirectory ,或者實際上任何觸及文件系統的函數都可以並且將相應地拋出和處理。

目錄上MSDN文檔

此類型的任何公共靜態(在Visual Basic中為Shared)成員都是線程安全的。 任何實例成員都不保證是線程安全的。

因此,由於CreateDirectory是靜態的,是的,它是線程安全的。

這就是說 :正如@JaredPar指出的那樣,線程安全問題並不是方法拋出異常的唯一原因。 文件系統調用可能會拋出異常(在任何情況下,多線程或非多線程),並且您需要考慮這些原因,這有很多原因。

通過說它是線程安全的I(和MSDN)只暗示對它的字面解釋,意思是“此方法不會以可能導致無效狀態,競爭條件或通常與不安全相關的其他不利影響的方式修改共享程序狀態多線程代碼“

要詳細說明@JaredPar的答案,你手上就有競爭條件。 如果第一個呼叫完全創建了文件夾,只有第二個呼叫開始,一切都會正常。

但是,如果第二個呼叫在仍處理第一個呼叫時到達操作系統,則操作系統可能會使第二個呼叫失敗以鎖定問題,並且您將獲得異常。

它仍然是線程安全的,因為您不會創建任何不可預測的文件夾,或根本沒有文件夾。

詳細說明 - 雖然我並非100%確定Windows在同時創建兩個同一文件夾時沒有內部競爭條件,但我很確定你無法通過這樣做來廢棄磁盤,或者兩個創作都陷入死亡之中陷入僵局。 其中一個會成功,另一個會失敗,但會創建文件夾。

所以你的啟發式,只是為了絕對肯定,應該是這樣的:

  • 創建目錄
  • 如果失敗,請等待一段隨機時間(例如,在0.2到0.5秒之間),然后再試一次。
  • 如果它經常失敗(例如,連續3次),你手上還有另一個問題 - 對文件夾,完整磁盤等沒有權限。

    順便提一下,為什么不在應用程序開始運行時創建文件夾?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM