次のようなコードがあるとします。
#include "boost/thread/mutex.hpp"
using boost::mutex;
typedef mutex::scoped_lock lock;
mutex mut1, mut2;
void Func() {
// ...
}
void test_raiicomma_1() {
lock mut1_lock(mut1);
Func();
}
void test_raiicomma_2() {
(lock(mut1)), Func();
}
void test_raiicomma_3() {
(lock(mut1)), (lock(mut2)), Func(); // Warning!
}
int main()
{
test_raiicomma_1();
test_raiicomma_2();
test_raiicomma_3();
return 0;
}
関数test_raiicomma_1
()が複数のスレッドから呼び出された場合、ミューテックスをロックして、他のスレッドも同時に呼び出さFunc()
れないようにします。ミューテックスは、変数mut1_lock
が作成されるとロックされ、スコープから外れて破棄されると解放されます。
これは完全に正常に機能しますが、スタイルの問題として、ロックを保持している一時オブジェクトに名前を付ける必要があると、私はイライラしました。関数test_raiicomma_2()
は、ロックオブジェクトを初期化し、1つの式内で関数を呼び出すことにより、これを回避しようとしますFunc()
。
Func()
一時オブジェクトデストラクタは、式が戻った後、式が終了するまで呼び出されないというのは正しいですか?(もしそうなら、このイディオムを使用する価値があると思いますか、それとも別のステートメントでロックを宣言する方が常に明確ですか?)
関数test_raiicomma_3()
が2つのミューテックスをロックする必要がある場合、ミューテックスが呼び出す前に順番にロックされ、Func()
後で解放されるのは正しいですか?残念ながら、どちらの順序でも解放される可能性がありますか?