2012-07-02 65 views
0

我的問題是對先前問here問題的擴展。在C中的多線程應用程序中製作一個目錄樹

我需要創建一個可能存在或不存在的目錄樹,而且多線程可以嘗試創建這樣的目錄結構。引用的問題解決了單線程的問題。該函數是否是線程安全的,或者是否有任何特定的方法。我使用的是C,操作系統是Ubuntu。

+0

什麼操作系統? – Joe

+0

我編輯了這個問題。 –

回答

1

在libc中,mkdir可以設置錯誤值EEXIST這意味着'該目錄已經存在'。謝謝Jonathan Leffler「只要您告訴編譯使線程安全,errno就是線程安全的」。

創建目錄是單調的 - 你總是添加新的目錄,而不是刪除它們。所以你可以創建一個目錄樹(試圖在每個級別創建每個目錄),如果其他線程首先到達那裏,這不是問題,繼續下去。

如果我是你,我會讓每個線程遞歸地創建它的整個路徑,忽略錯誤。當它完成它的路徑時,它應該測試該目錄是否存在。如果它不存在,則是一個問題(因爲用於創建所需路徑的mkdir操作的順序將在該線程內同步)。如果確實存在,恭喜。

+0

只要您告訴編譯使線程安全,'errno'就是線程安全的。 –

+0

很酷。我會更新我的答案。 – Joe

0

操作系統將處理多個線程,試圖在「同一時間」創建相同的目錄。至多一個人會成功;另一個會失敗,可能是EISDIR(或者EEXIST)作爲錯誤。

交叉引用問題中的代碼不會從EISDIR錯誤中恢復。但是,如果您在檢查返回碼時發現errno是相關錯誤,則可以決定再試一次。