< 目次

インテル® oneAPI スレッディング・ビルディング・ブロック (oneTBB) 簡単なミューテックスの例

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

関連情報