質問

私のWin32アプリA1(実際にはプロセスのコレクション)が使用しようとしています CreateDirectory 親ディレクトリP内でディレクトリD1を作成するには、Pへのパスはの値です TMP 環境変数。これにより、Pは潜在的に忙しいが一般的に許容される場所になります。大部分の時間、すべてが正常に機能しますが、めったに、 CreateDirectory 失敗します GetLastError その後、戻ります ERROR_ACCESS_DENIED, 、この文脈での意味は文書化されていません。

ディレクトリD2をP内でできるだけ早く繰り返し作成および削除するだけのテストアプリケーションA2を作成しました。D2の間抜けな長い名前を選択しました。 。数分ごとに1秒のほんの一部があり、その間にA2がD2の収量のみを作成しようとします ERROR_ACCESS_DENIED 失敗。

A1は、実行中にP内で非常に忙しくなります。 A1とA2が同時に実行されている間、 ERROR_ACCESS_DENIED A1とA2がPへの排他的アクセスを求めて競合しているかのように、障害はやや頻繁に発生します(A1がD2と同じ名前を使用しないことは絶対に確信しています。:-)

私はやや服用する傾向があります ERROR_ACCESS_DENIED 「数ミリ秒で再試行してください。数回試してからうまくいかない場合は、あきらめてください」という意味です。そして[b]私は何が起こっているのか本当にわからないので、挑戦し続けるために合理的な時間を自信を持って確立することは不可能かもしれません。

誰かがこれを経験していますか?何かアドバイス?この時点で特に価値のあるものは、これが何が原因であるかについての手がかりです。そうすれば、問題をより簡単に再現できます。

役に立ちましたか?

解決

あなたは正しく死んでいます。 ドキュメンテーション その関数の可能なエラーコードとしてerror_access_deniedをリストすることさえしないので、バグになる可能性があります。

Retry/Backoff戦略を実装する際に提案するようにします。

言い換えれば、そのエラーが発生した場合は、遅延なしで最大3回再試行してください(エラー以外のリターンコードを取得した場合は、ここでは任意の時点で停止します)、さらに4回遅延して(たとえば、たとえば、 100ミリ秒、500ミリ秒、1秒および2秒)。

この種の戦略(私が以前に使用した)は、通常、一時的なリソース不足を回避します。 7回の試行と3.6の後もディレクトリを作成できない場合+ 数秒、おそらくそれが起こらないと想定することができます。

あなたの機能は(pseudo-code)と同じくらいugいかもしれません:

def createMyDir (dirname):
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    sleep (100)
    if createDir (dirName) return true;
    sleep (500)
    if createDir (dirName) return true;
    sleep (1000)
    if createDir (dirName) return true;
    sleep (2000)
    return createDir (dirName);

しかし、あなたはそれをもう少しエレガントにすることを望むかもしれません:

def createMyDir (dirname):
    delay = pointer to array [0, 0, 0, 100, 500, 1000, 2000, -1]
    okay = createDir (dirName)
    while not okay and [delay] not -1:
        if [delay] not 0:
            sleep ([delay])
        delay = next delay
        okay = createDir (dirName)
    return okay
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top