次の例は、簡単なミューテックスとスコープ付きロックを使用して、共有変数 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 テンプレート・クラスを提供します。詳細は、関連するトピックを確認してください。