Я прочитал вопрос, который был опубликован ранее, который, похоже, имел ту же ошибку, что и я, когда я использую wait для нескольких объектов, но я считаю, что у меня другая. Я использую несколько потоков для вычисления различных частей набора Мандельброта. Программа компилирует и выдает правильный результат примерно 3 из 5 раз, но иногда я получаю сообщение об ошибке "Нарушение доступа при записи в ... (некоторая область памяти, которая каждый раз меняется)" Как я уже сказал, иногда это работает, иногда нет. Я поставил точки останова до и после ожидания нескольких объектов и пришел к выводу, что это должно быть виновником. Я просто не знаю почему. Вот код ...
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;
}
Решено: Ладно, я нашел проблему. Ты был прав. Это было в самой теме. Проблема заключалась в том, что все потоки пытались добавить строки в мой двухмерный вектор отсчетов (counts.push_back (dummy)). Я предполагаю, что условие гонки вступило в силу, и каждый поток предполагал, что он должен добавить больше строк, даже когда в этом нет необходимости. Спасибо за помощь.