多线程返回单线程的不同结果

时间:2012-07-02 10:44:05

标签: c++ multithreading mutex

我的代码存在问题,即多线程和单线程之间的结果不同。

我有一个功能,它接收输入图像,并围绕中心旋转n步,并对该图像进行一些分析。为了提高速度,我重新编写了函数,将起始角度和结束角度作为输入,并计算两者之间的值。

原型是

void rotateImageConvolution(float* image, int startMin, int startMax)

现在当我用0..180调用该函数时,它每次都会返回相同的结果,这很好。 由于我有一个4核CPU,我有3个线程运行,0..60,60..120,120..180,因为它去了 (int i = startMin; i< 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);
}

使用的所有其他内存都在函数中分配并再次释放。 有趣的是,如果我在第一部分禁用互斥锁,我会得到随机结果,很多不同的结果。如果我启用它们,我得到两个结果中的一个,一个是正确的结果(与单线程相同),一半是不同的结果。

我无法弄清楚这里发生了什么,也看不出那里出了什么问题。

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

如果你的互斥量包装了整个if语句怎么办?请记住,if语句可能正在读取convolution_image [i],而另一个线程正在编写它。

可能绊倒你的情景:

  1. 线程1刚刚完成锁定关键部分
  2. 线程2然后评估if语句。
  3. 然后线程2被互斥锁
  4. 阻止
  5. 线程1解锁互斥锁(并暗示,已计算出convolution_image [i])。
  6. 线程2然后锁定临界区,然后继续计算与线程1在步骤#4中所做的相同的convolution_image [i]。