同じメモリー位置を使用するコードの実行を同期することで、更新の共有問題を解決できます。2 つ以上のタスクが同時に実行されるべきではない操作のグループを含む場合、これらすべての操作のグループの実行を制御するロックが必要となります。このような操作のグループはトランザクションと呼ばれ、単一変数の読み取り/変更/書き込みだけでなく、複数のデータ構造の変更に関連する集合の場合もあります。
トランザクションを開始する前に、タスクはトランザクションを制御するロックを取得し、トランザクションが完了したらそれを解放する必要があります。あるタスクがすでにロックを取得済みで、別のタスクが同じロックを要求すると、2 つ目のタスクは最初のタスクがロックを解放するまで実行を停止します。これにより、同じロックを使用する 2 つのトランザクションは、同時に実行されないことが保証されます。
インテル® Advisor のロック・アノテーション ANNOTATE_LOCK_ACQUIRE と ANNOTATE_LOCK_RELEASE を使用して、ロックするトランザクションを指定します。ロック・アノテーションは、後で選択した並列フレームワークのロックを使用して実際の実装に書き換えることができます。
void do_something()
{
static bool initialized = false;
ANNOTATE_LOCK_ACQUIRE(0);
if (!initialized) {
do_the_initialization();
initialized = true;
}
ANNOTATE_LOCK_RELEASE(0);
do_the_real_work();
}ロックは、ロックアドレスによって識別されます。