2012-07-02 6 views
0

У меня проблема с моим кодом, который отличается от того, что результат между многопоточными и однопоточными отличается.Многопоточность возвращает другой результат от одного потока

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

Я не могу понять, что здесь происходит, и не может видеть, что там происходит.

В чем может быть проблема?

+0

Сначала я попытался использовать один мьютекс, а не массив мьютексов, и посмотреть, не по-прежнему ли вы получите неправильные результаты. все индексированные типы в вашем коде просто массивы? – wreckgar23

ответ

1

Что делать, если ваш мьютекс обертывает все инструкции if? Имейте в виду, что ваш оператор if может читать в convolution_image [i], в то время как другой поток находится в середине его написания.

Сценарий, может быть отключение вас:

  1. Thread 1 раз заканчивает блокировку критической секции
  2. тему 2 затем оценивает, если заявление.
  3. Резьба 2 затем блокируется мьютексом
  4. Резьба 1 разблокирует мьютексы (и подразумевается, вычислено convolution_image [i]).
  5. Thread 2 затем блокирует критический раздел, а затем переходит и вычисляет тот же файл convolution_image [i], что и поток 1 на шаге 4.
+0

Спасибо, что именно произошло, разные потоки рассчитали одни и те же значения, таким образом, это было случайным, по которому это было первым. – SinisterMJ

+0

На самом деле, мне нужно исправить себя. Я передал структуру в поток в качестве параметров для вызова функции, и через гоночное состояние иногда параметры были установлены на параметры следующего потока.Решила это, добавив вектор, содержащий все начальные параметры в потоке, так что не может произойти сетка. – SinisterMJ

Смежные вопросы