2012-07-13 136 views
3

在C/C++中是否有線程安全實現nftw()?在它的文檔中說nftw線程安全

「nftw()函數不需要是線程安全的。」

我將使用nftw作爲遞歸刪除函數來遍歷多線程應用程序中的目錄結構。

+1

無論如何,你可能不會得到任何加速,因爲在目錄樹中進行I/O綁定。 – Mysticial 2012-07-13 01:10:55

+0

爲了性能的目的,OP沒有說他/她想要一個多線程'nftw'或者在不同線程中執行多個目錄樹遍歷。問題在於,根據規範,'nftw'對於多線程的使用並不安全,所以如果應用程序是多線程的,則必須做出特殊的(通常非常昂貴的)努力來確保無法在其中調用它一次有多個線程。 – 2012-07-13 01:25:55

+0

有誰知道爲什麼nftw不是線程安全的? – 2014-04-21 15:54:51

回答

5

使線程安全的非線程安全函數的一個微不足道的方法是將其封裝在一個函數中,該函數在調用它之前獲取一個鎖,並且始終通過該包裝來調用它。一般而言,您需要在解鎖之前複製結果,但nftw不會產生需要在返回後複製的結果。但有幾點需要注意:

  1. 這當然會阻止多線程想要使用接口時的所有並行性。

  2. nftw的一個選項使其chdir到它所走的每個目錄。對於多線程應用程序來說這是一件非常糟糕的事情(因爲當前目錄被所有線程共享),所以你應該避免使用這個選項。

在POSIX 2008系統與openat和相關接口,這是很容易實現自己的nftw相當於沒有任何chdir使用或路徑名長度的限制,所以你可能會更好只是寫你自己的。

+1

+1公頃,我沒有考慮OP可能只是在正確性而不是性能之後的可能性。 – Mysticial 2012-07-13 01:37:51

+0

..當然,更重要的是確保你的代碼只從一個線程調用'nftw()'。如果您將當前工作目錄作爲資源單獨處理並通過互斥鎖保護,您也可以使用'chdir()'。 – caf 2012-07-13 01:57:14

+0

@caf:如果你是'chdir',那麼你的程序中任何相對路徑名的使用必須在鎖定下完成。我寧願將當前工作目錄視爲一個常量,最初調用該程序的目錄,或者在長時間的程序中用'chdir('/')'完全廢除它,因爲您不想防止卸載文件系統。 – 2012-07-13 02:37:26