Mon application Win32 A1 (en réalité une collection de processus) essaie d'utiliser CreateDirectory
pour créer un répertoire D1 dans le répertoire parent P. Le chemin vers P est la valeur de l'environnement TMP
variable, ce qui fait de P un lieu potentiellement occupé mais généralement permissif. La grande majorité du temps, tout fonctionne bien, mais, rarement, CreateDirectory
échoue et GetLastError
renvoie alors ERROR_ACCESS_DENIED
, dont la signification dans ce contexte n'est pas documentée. J'ai écrit une application de test A2 qui ne fait que créer et supprimer à plusieurs reprises un répertoire D2 aussi rapidement que possible dans P, et j'ai choisi un nom long et maladroit pour D2 qui, j'en suis persuadé, n'entre pas en collision avec autre programme utiliserait. Une fois toutes les quelques minutes, il y a une petite fraction de seconde au cours de laquelle les tentatives de A2 pour créer D2 ne produisent que des échecs ERROR_ACCESS_DENIED
.lorsque CreateDirectory renvoie ERROR_ACCESS_DENIED et "ne devrait pas"
A1 devient très occupé dans P pendant son exécution. Alors que A1 et A2 tournent simultanément, les périodes d'échec ERROR_ACCESS_DENIED
se produisent un peu plus fréquemment, comme si A1 et A2 sont en concurrence pour un accès exclusif à P. (Je suis absolument certain que A1 n'utilise pas le même nom que D2.)
Je suis un peu enclin à prendre ERROR_ACCESS_DENIED
pour signifier "essayer à nouveau dans quelques millisecondes, et si cela ne fonctionne pas après quelques essais, abandonner", mais je suis inquiet que [a] dans certains cas cela peut signifier quelque chose de permanent dont je devrais tenir compte tout de suite, et [b] parce que je ne sais pas vraiment ce qui se passe, il ne sera peut-être pas possible d'établir en toute confiance un délai raisonnable pour continuer à essayer.
Quelqu'un a-t-il de l'expérience? Aucun conseil? Une valeur particulière à ce stade serait des indices sur ce qui cause cela afin que je puisse reproduire le problème plus facilement.
Cela semble fonctionner assez bien dans un scénario de test. Cependant, il semble que je ne puisse plus reproduire ce problème dans mon vrai programme. Une idée de ce qui le cause? –