1

여러 객체를 기다릴 때 사용하는 것과 동일한 오류가있는 것 같았던 이전에 게시 된 질문을 읽었지만 광산이 다른 것으로 생각됩니다. 난 mandelbrot 집합의 다른 부분을 계산하기 위해 여러 스레드를 사용하고 있습니다. 프로그램은 컴파일하고 5 번 중 3 번 정도 정확한 결과를 산출하지만 때로는 "쓰기시 액세스 위반 (매번 다른 메모리 위치)"이라는 오류가 발생합니다. 내가 말했듯이, 때로는 효과가 있고 때로는 그렇지 않습니다. 나는 waitformultipleobjects의 전후에 중단 점을 넣고 그 점이 범인이라고 결론 내렸다. 나는 이유를 모른다. 여기에 코드가 있습니다 ...쓰기시 WaitForMultipleObjects 액세스 위반

int max = size(); 
if (max == 0)    //Return false if there are no threads 
    return false; 

for(int i=0;i<max;++i)   //Resume all threads 
    ResumeThread(threads[i]); 

HANDLE *first = &threads[0]; //Create a pointer to the first thread 
WaitForMultipleObjects(max,first,TRUE,INFINITE);//Wait for all threads to finish 

업데이트 : for 루프와 WaitForSingleObject를 사용하여 시도했지만 문제가 지속됩니다. 업데이트 2 : 다음은 스레드 기능입니다. 모든 포인터를 사용하면 추한 것처럼 보입니다.

unsigned MandelbrotSet::tfcn(void* obj) 
{ 
funcArg *args = (funcArg*) obj; 
int count = 0; 
vector<int> dummy; 

while(args->set->counts.size() <= args->row) 
{ 
     args->set->counts.push_back(dummy); 
} 
for(int y = 0; y < args->set->nx; ++y) 
{ 

    complex<double> c(args->set->zCorner.real() + (y * args->set->dx), args->set->zCorner.imag() + (args->row * args->set->dy)); 
    count = args->set->iterate(c); 
    args->set->counts[args->row].push_back(count); 
} 
return 0; 
} 

해결 : 모두들, 문제를 발견했습니다. 당신이 옳았. 스레드 자체에있었습니다. 문제는 모든 스레드가 2 차원 벡터 (counts.push_back (dummy))에 행을 추가하려고 시도했기 때문입니다. 경쟁 조건이 적용되고 각 스레드는 필요하지 않은 경우에도 더 많은 행을 추가해야한다고 생각했습니다. 도와 주셔서 감사합니다.

+0

가까이 있지 않으므로이 스 니펫에 글을 쓸 수 없습니다. –

+0

어디서나 SuspendThread를 호출하지 않기를 바랍니다. 그게 문제가 될 수 있습니다. 어쨌든, 문제는 스레드 코드에서 작동하는 것 같지만 WFMO에서 기다리는 주 스레드는 매우 잘 보입니다. – Dialecticus

+1

버그가 외부보다 스레드 내부에있을 수 있음 –

답변

0

나는이 문제를 해결했다. 나는 그 질문을 편집하고 무엇이 잘못되었는지 말했지만 여기서 다시 할 것이다. 내 스레드 함수에서 2D 벡터에 복소수 벡터를 푸시하려고했을 때 경쟁 조건이 발생했습니다. 이것은 while 루프에 의해 제어되며 각 스레드가 실행될 때 각 스레드는 count라는 2 차원 벡터에 더 많은 벡터를 밀어 넣어야한다고 생각합니다. 이 루프를 생성자로 옮기고 생성시 모든 필요한 벡터를 카운트에 집어 넣었습니다. 다른 방향으로 보도록 도와 주셔서 감사합니다.