次の例は、簡単なミューテックスとスコープ付きロックを使用して、共有変数 count を保護するインテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) ミューテックスの基本的な使い方を示します。
#include <tbb/mutex.h>
int count;
tbb::mutex countMutex;
int IncrementCount() {
int result;
// oneTBB のミューテックスを追加
countMutex.lock(); // ANNOTATE_LOCK_ACQUIRE() を実装
result = count++; // アンロック後まで結果を保存
countMutex.unlock(); // ANNOTATE_LOCK_RELEASE() を実装
return result;
}
countMutex の countMutex.lock() と unlock() のセマンティクスは、ANNOTATE_LOCK_ACQUIRE() と ANNOTATE_LOCK_RELEASE() アノテーションに直接対応します。しかし、一般にスコープ付きロックを使用した方が良いでしょう。
スコープ付きロックで、ロックの取得を表現する一時オブジェクト scoped_lock を作成します。scoped_lock オブジェクトの破棄は、ミューテックスのロックを解放します。
次のコードは、前述の例をスコープ付きロックを使用して書き換えたものです。
#include <tbb/mutex.h>
int count;
tbb::mutex countMutex;
int IncrementCount() {
int result;
{
// ANNOTATE_LOCK アノテーションの場所にoneTBB のスコープ付きロックを追加します
tbb::mutex::scoped_lock lock(countMutex); // ANNOTATE_LOCK_ACQUIRE() の実装
result = count++;
// スコープから以下に出る特に暗黙の ANNOTATE_LOCK_RELEASE()
} // スコープ付きロックはここで自動的に解放されます
return result;
}
コントロールがブロックからどのように離脱しても、ロックを解放するには scoped_lock パターンが推奨されます。スコープ付きロックは、scoped_lock オブジェクトが破棄されると解放されます。例外がスローされて制御フローから出るときにもロックを解放します。
oneTBB はまた、共有整数変数の管理など単純なケースで使用される、tbb::atomic テンプレート・クラスを提供します。詳細は、関連するトピックを確認してください。