OpenMP 3.0 以降、ロックの所有者はスレッドではなくタスクです。タスクによってロックが取得されると、そのタスクがロックを所有します。タスクの完了前に、同じタスクがそのロックを解放する必要があります。ただし、critical 構文は、スレッドベースの相互排他メカニズムのままです。
ロックはタスクによって所有されるので、ロックを使用する際は十分に注意してください。次の例は OpenMP 2.5 仕様に準拠しています。並列領域でロック lck を解放するスレッドが、プログラムの順次処理部分でそのロックを取得したのと同じスレッドであるためです。並列領域のマスタースレッドと初期のスレッドは同一です。ところが、この例はそれ以降の仕様には準拠していません。ロック lck を解放するタスク領域が、そのロックを取得したタスク領域と異なるためです。
使用例 4-7 OpenMP 3.0 より前のロックの使用#include <stdlib.h>
#include <stdio.h>
#include <omp.h>
int main()
{
int x;
omp_lock_t lck;
omp_init_lock (&lck);
omp_set_lock (&lck);
x = 0;
#pragma omp parallel shared (x)
{
#pragma omp master
{
x = x + 1;
omp_unset_lock (&lck);
}
}
omp_destroy_lock (&lck);
}