我的代码存在问题,即多线程和单线程之间的结果不同。
我有一个功能,它接收输入图像,并围绕中心旋转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);
}
使用的所有其他内存都在函数中分配并再次释放。 有趣的是,如果我在第一部分禁用互斥锁,我会得到随机结果,很多不同的结果。如果我启用它们,我得到两个结果中的一个,一个是正确的结果(与单线程相同),一半是不同的结果。
我无法弄清楚这里发生了什么,也看不出那里出了什么问题。
可能是什么问题?
答案 0 :(得分:1)
如果你的互斥量包装了整个if语句怎么办?请记住,if语句可能正在读取convolution_image [i],而另一个线程正在编写它。
可能绊倒你的情景: