여러 객체를 기다릴 때 사용하는 것과 동일한 오류가있는 것 같았던 이전에 게시 된 질문을 읽었지만 광산이 다른 것으로 생각됩니다. 난 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))에 행을 추가하려고 시도했기 때문입니다. 경쟁 조건이 적용되고 각 스레드는 필요하지 않은 경우에도 더 많은 행을 추가해야한다고 생각했습니다. 도와 주셔서 감사합니다.
가까이 있지 않으므로이 스 니펫에 글을 쓸 수 없습니다. –
어디서나 SuspendThread를 호출하지 않기를 바랍니다. 그게 문제가 될 수 있습니다. 어쨌든, 문제는 스레드 코드에서 작동하는 것 같지만 WFMO에서 기다리는 주 스레드는 매우 잘 보입니다. – Dialecticus
버그가 외부보다 스레드 내부에있을 수 있음 –