2010-08-21 4 views
2

내 Win32 응용 프로그램 A1 (실제로 프로세스 컬렉션)이 CreateDirectory을 사용하여 상위 디렉터리 P 내에 디렉터리 D1을 만들려고합니다. P 경로는 TMP 환경의 값입니다 변수는 P를 잠재적으로 바쁘지 만 일반적으로 허용하는 장소로 만듭니다. 대다수의 경우 모든 것이 잘 작동하지만 드물게 CreateDirectory이 실패하고 GetLastErrorERROR_ACCESS_DENIED을 반환합니다. 그 의미는이 컨텍스트에서 설명하지 않습니다.CreateDirectory가 ERROR_ACCESS_DENIED를 반환하고 "should not"일 때

나는 P를 할 수있는만큼 빠르게 디렉토리 D2를 만들고 삭제하는 테스트 응용 프로그램 A2를 작성했는데 나는 그 어떤 것과도 충돌하지 않는다고 확신하는 D2의 구피 긴 이름을 선택했다. 다른 프로그램이 사용합니다. 몇 분에 한 번, A2의 D2를 만들려고 시도 할 때마다 ERROR_ACCESS_DENIED 오류 만 발생합니다.

A1은 실행 중에 P 내에서 매우 바빠집니다. A1과 A2가 동시에 실행되는 동안 A1과 A2가 P에 대한 독점적 인 액세스를 위해 경쟁하는 것처럼 다소 ERROR_ACCESS_DENIED 실패 기간이 다소 자주 발생합니다. (나는 A1이 D2와 동일한 이름을 사용하지 않는다고 확신합니다 :-)

나는 약간의 밀리 초 후에 다시 시도하고 몇 번 시도해도 작동하지 않으면 을 사용하는 경향이 있지만 어떤 경우에는 그다지 걱정하지 않습니다. 그것은 즉각적인주의를 기울여야 할 영구적 인 의미 일 수 있습니다. 그리고 나는 실제로 어떤 일이 일어나고 있는지 알지 못하기 때문에 노력을 계속하기에 합당한 시간을 확보하는 것이 불가능할 수도 있습니다.

누구나이 경험이 있습니까? 어떤 충고? 이 시점에서의 특별한 가치는이 문제의 원인에 대한 단서가 될 수 있으므로 문제를보다 쉽게 ​​재현 할 수 있습니다.

답변

1

당신이 죽었습니다. documentation은 ERROR_ACCESS_DENIED를 해당 함수의 가능한 오류 코드로 나열하지 않으므로 버그 일 수 있습니다.

재시도/백 오프 전략을 구현하는 것이 좋습니다.

즉, 오류가 발생하면 지연없이 최대 3 번 다시 시도하십시오 (오류가없는 반환 코드를받는 경우 여기에서 멈추십시오). 지연 시간은 최대 4 회까지 증가합니다. (예 : 100 밀리 초, 500 밀리 초, 1 초 및 2 초).

이런 종류의 전략은 (이전에 사용했던) 일반적으로 임시 리소스 부족을 해결합니다. 7 번의 시도와 3.6 + 초 후에도 디렉토리를 생성 할 수 없다면, 아마 그 일이 일어나지 않을 것이라고 가정 할 수 있습니다.

함수가 (의사 코드)로 추악한 수 :

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 
+0

이것은 잘 합리적으로 작동하는 것 같다 테스트 시나리오. 그러나, 나는 더 이상 내 실제 프로그램에서이 문제를 재현 할 수없는 것 같습니다. 무엇이 그것을 일으키는 지 아십니까? –

관련 문제