WaitForMultipleObjects нарушает доступ при записи - PullRequest
1 голос
/ 10 октября 2011

Я прочитал вопрос, который был опубликован ранее, который, похоже, имел ту же ошибку, что и я, когда я использую 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)). Я предполагаю, что условие гонки вступило в силу, и каждый поток предполагал, что он должен добавить больше строк, даже когда в этом нет необходимости. Спасибо за помощь.

1 Ответ

0 голосов
/ 10 октября 2011

Я решил проблему. Я отредактировал вопрос и указал, что случилось, но я сделаю это снова здесь. Я столкнулся с состоянием гонки, когда пытался переместить вектор комплексных чисел в двухмерный вектор в своей функции потока. Это контролируется циклом while, и когда каждый поток выполняется, каждый поток полагает, что ему нужно выдвинуть больше вектора в двумерный вектор, называемый счетчиками. Я переместил этот цикл в конструктор и просто поместил все необходимые векторы на счет при создании. Спасибо, что помогли мне взглянуть в другом направлении!

...