CRITICAL_SECTION
ミューテックスではなく、を使用する必要があります。彼らははるかに高速です。で初期化すると、スピンロックのような動作を得ることができますInitializeCriticalSectionAndSpinCount()
。
他の人が言ったように、すべてのピクセルにミューテックスを持つのは正気ではありません。スレッドはいくつありますか?
ロックをまったく必要としないはずであり、これらすべてのスレッドを自分で作成する代わりに、OpenMP と並行してイメージを処理できます。OpenMP の特徴は、出力画像の各行に 1 つの並列化された外部ループを配置し、その内部でその行の各ピクセルを調べることができることです。これで、出力は独立しています。
回転を行うには、その出力ピクセルの位置から逆回転のピクセル位置を見つけ、その位置でカラー値をエリア サンプリングします。特に、各画像に対して 1 つの 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;
}
}