4

C / C ++でのnftw()のスレッドセーフな実装はありますか?ドキュメントにはそれが書かれています

「nftw()関数はスレッドセーフである必要はありません。」

マルチスレッドアプリケーションのディレクトリ構造をウォークスルーする再帰削除関数にnftwを使用します。

4

1 に答える 1

6

非スレッドセーフ関数をスレッドセーフにする簡単な方法の1つは、呼び出す前にロックを取得する関数でラップし、常にこのラッパーを介して呼び出すことです。通常、ロックを解除する前に結果をコピーする必要がありますがnftw、戻った後にコピーする必要のある結果は生成されません。ただし、いくつかの注意点があります。

  1. もちろん、これにより、複数のスレッドがインターフェースを使用する場合のすべての並列処理が防止されます。

  2. ウォークする各ディレクトリに到達nftwするための1つのオプション。chdirこれはマルチスレッドアプリにとって非常に悪いことです(現在のディレクトリはすべてのスレッドで共有されているため)。したがって、このオプションの使用は避けてください。

および関連するインターフェイスを備えたPOSIX2008システムでは、使用法やパス名の長さの制限なしにopenat同等のものを実装するのは非常に簡単なので、独自に作成する方がよい場合があります。nftwchdir

于 2012-07-13T01:33:46.967 に答える