您应该使用CRITICAL_SECTION
,而不是互斥锁。他们要快得多。如果使用 初始化,您可以获得类似自旋锁的行为InitializeCriticalSectionAndSpinCount()
。
就像其他人所说的那样,为每个像素设置一个互斥体是很疯狂的。你有多少线程?
您根本不需要任何锁定,您可以与 OpenMP 并行处理图像,而不是自己创建所有这些线程。OpenMP 的问题是,您可以有一个并行化的外部循环遍历输出图像的每一行,并在其中查看该行中的每个像素。现在你的输出是独立的。
要进行旋转,您需要从该输出像素的位置找到反向旋转的像素位置,然后对该位置的颜色值进行区域采样。这根本不应该是计算密集型的,特别是因为您只需为每个图像进行一次 sin 和 cos 计算(您的角度不会因每个像素而改变)。
所以,回顾一下……没有工作线程,没有互斥体,没有对 sin/cos 的冗余调用。您会惊讶于您的代码以多快的速度结束。
double sintheta = sin(theta);
double costheta = cos(theta);
#pragma omp parallel for
for( int y = 0; y < height; y++ ) {
RGB * inputRow = &inputImage[y * width];
RGB * outputRow = &outputImage[y * width];
for( int x = 0; x < width; x++ ) {
// Whatever your rotation code should be.... =)
double rotx = -((double)x - xCentre) * costheta;
double roty = -((double)y - yCentre) * sintheta;
// Interpolate colour from input image. We've landed inside
// a 2x2 square of pixels. Take some of each. I'll leave the
// sampling to you...
RGB val;
// TODO
// Output the rotated pixel without thread contention.
outputRow[x] = val;
}
}