У меня проблема с моим кодом, который отличается от того, что результат между многопоточными и однопоточными отличается.Многопоточность возвращает другой результат от одного потока
У меня есть функция, которая принимает входное изображение и вращается в n шагов по центру и делает некоторый анализ на этом изображении. Чтобы увеличить скорость, я переписал функцию для ввода в качестве начального угла и конечного угла, и он вычисляет значения между ними.
Прототип
void rotateImageConvolution(float* image, int startMin, int startMax)
Теперь, когда я называю эту функцию с 0..180, он будет возвращать тот же результат каждый раз, который работает отлично. Так как у меня есть 4 ядра процессора, у меня есть 3 нити работает, происходит 0..60, 60..120, 120..180, так как он идет (INT I = startMin, я < startMax)
только записи в глобальной памяти
if(convolution_image[i] < convrst)
{
WaitForSingleObject(mLock[i], // handle to mutex
INFINITE); // no time-out interval
if(convolution_image[i] < convrst)
{
convolution_image[i] = convrst;
r_map_image[i] = (unsigned char)r0;
orientation_map_image[i] = (unsigned char)a;
}
ReleaseMutex(mLock[i]);
}
, где convrst является результатом свертки, а convolution_image сохраняет вычисленные значения. я это индекс в изображении и идет 0..imagesize MLOCK представляет собой блок-ручек
mLock = new HANDLE[imgsize];
for(int i = 0; i < imgsize; ++i)
{
mLock[i] = CreateMutex(NULL, FALSE, NULL);
}
все остальные памяти используется выделяется в функции и освободили снова. Самое смешное, если я отключу Mutex в части convrst, я получаю случайные результаты, много разных. Если я их включу, я получаю один из двух результатов, один из которых является правильным результатом (то же, что и однопоточное), а в два раза меньше другого.
Я не могу понять, что здесь происходит, и не может видеть, что там происходит.
В чем может быть проблема?
Сначала я попытался использовать один мьютекс, а не массив мьютексов, и посмотреть, не по-прежнему ли вы получите неправильные результаты. все индексированные типы в вашем коде просто массивы? – wreckgar23