[英]Is CreateDirectory() in C# thread-safe?
我可以安全地嘗試從兩個不同的線程創建相同的目錄,而不會讓其中一個拋出異常,或遇到其他問題嗎?
請注意,根據MSDN ,可以在已存在的目錄上調用CreateDirectory()
,在這種情況下,該方法不會執行任何操作。
Directory.CreateDirectory
調用本身可以安全地從多個線程進行。 如果這樣做,它不會破壞程序或文件系統狀態。
但是,無法以這種方式調用Directory.CreateDirectory
以保證它不會拋出異常。 文件系統是一個不可預測的野獸,可以在任何給定時間由您控制之外的其他程序更改。 例如,很可能看到以下情況發生
c:\\temp\\foo
調用CreateDirectory
並成功 c:\\temp
訪問權限 CreateDirectory
並因訪問不足而拋出 簡而言之,您必須假設Directory.CreateDirectory
,或者實際上任何觸及文件系統的函數都可以並且將相應地拋出和處理。
要詳細說明@JaredPar的答案,你手上就有競爭條件。 如果第一個呼叫完全創建了文件夾,只有第二個呼叫開始,一切都會正常。
但是,如果第二個呼叫在仍處理第一個呼叫時到達操作系統,則操作系統可能會使第二個呼叫失敗以鎖定問題,並且您將獲得異常。
它仍然是線程安全的,因為您不會創建任何不可預測的文件夾,或根本沒有文件夾。
詳細說明 - 雖然我並非100%確定Windows在同時創建兩個同一文件夾時沒有內部競爭條件,但我很確定你無法通過這樣做來廢棄磁盤,或者兩個創作都陷入死亡之中陷入僵局。 其中一個會成功,另一個會失敗,但會創建文件夾。
所以你的啟發式,只是為了絕對肯定,應該是這樣的:
如果它經常失敗(例如,連續3次),你手上還有另一個問題 - 對文件夾,完整磁盤等沒有權限。
順便提一下,為什么不在應用程序開始運行時創建文件夾?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.