私の質問は、以前にここで尋ねられた質問の拡張です。
以前に存在する場合と存在しない場合があるディレクトリツリーを作成する必要があります。さらに、複数のスレッドがそのようなディレクトリ構造を作成しようとする可能性があります。引用された質問は、シングルスレッドの問題を解決します。その関数はスレッドセーフですか、それとも特定の方法がありますか。私が使用C
しているOSはUbuntuです。
私の質問は、以前にここで尋ねられた質問の拡張です。
以前に存在する場合と存在しない場合があるディレクトリツリーを作成する必要があります。さらに、複数のスレッドがそのようなディレクトリ構造を作成しようとする可能性があります。引用された質問は、シングルスレッドの問題を解決します。その関数はスレッドセーフですか、それとも特定の方法がありますか。私が使用C
しているOSはUbuntuです。
EEXIST
libcでは、mkdirは「そのディレクトリがすでに存在する」ことを意味するエラー値を設定できます。Jonathan Lefflerに感謝します。「コンパイルにスレッドセーフにするように指示する限り、errnoはスレッドセーフです」。
ディレクトリの作成は単調です。ディレクトリを削除するのではなく、常に新しいディレクトリを追加します。したがって、ディレクトリツリーを作成でき(各レベルで各ディレクトリを作成しようとします)、他のスレッドが最初にそこに到達した場合でも、問題はありません。続行します。
私があなたなら、エラーを無視して、各スレッドにパス全体を再帰的に作成させます。パスの構築が完了すると、ディレクトリが存在するかどうかをテストする必要があります。それが存在しない場合、それは問題です(必要なパスを作成するために使用した一連のmkdir
操作がスレッド内で同期されるため)。存在する場合は、おめでとうございます。
O / Sは、「同時に」同じディレクトリを作成しようとする複数のスレッドを処理します。せいぜい1つが成功します。もう一方は失敗します。おそらくEISDIR(またはおそらくEEXIST)がエラーです。
相互参照された質問のコードは、EISDIRエラーから回復しません。errno
ただし、戻りコードを確認したときに関連するエラーを見つけた場合は、再試行することを決定できます。