我的問題是對先前問here問題的擴展。在C中的多線程應用程序中製作一個目錄樹
我需要創建一個可能存在或不存在的目錄樹,而且多線程可以嘗試創建這樣的目錄結構。引用的問題解決了單線程的問題。該函數是否是線程安全的,或者是否有任何特定的方法。我使用的是C
,操作系統是Ubuntu。
我的問題是對先前問here問題的擴展。在C中的多線程應用程序中製作一個目錄樹
我需要創建一個可能存在或不存在的目錄樹,而且多線程可以嘗試創建這樣的目錄結構。引用的問題解決了單線程的問題。該函數是否是線程安全的,或者是否有任何特定的方法。我使用的是C
,操作系統是Ubuntu。
在libc中,mkdir可以設置錯誤值EEXIST
這意味着'該目錄已經存在'。謝謝Jonathan Leffler「只要您告訴編譯使線程安全,errno就是線程安全的」。
創建目錄是單調的 - 你總是添加新的目錄,而不是刪除它們。所以你可以創建一個目錄樹(試圖在每個級別創建每個目錄),如果其他線程首先到達那裏,這不是問題,繼續下去。
如果我是你,我會讓每個線程遞歸地創建它的整個路徑,忽略錯誤。當它完成它的路徑時,它應該測試該目錄是否存在。如果它不存在,則即是一個問題(因爲用於創建所需路徑的mkdir
操作的順序將在該線程內同步)。如果確實存在,恭喜。
只要您告訴編譯使線程安全,'errno'就是線程安全的。 –
很酷。我會更新我的答案。 – Joe
操作系統將處理多個線程,試圖在「同一時間」創建相同的目錄。至多一個人會成功;另一個會失敗,可能是EISDIR(或者EEXIST)作爲錯誤。
交叉引用問題中的代碼不會從EISDIR錯誤中恢復。但是,如果您在檢查返回碼時發現errno
是相關錯誤,則可以決定再試一次。
什麼操作系統? – Joe
我編輯了這個問題。 –