一部の人々はロックが書き込みによる誤使用できることを警告している。代わりに、次の正しい文のC++で一時変数を明示的にインスタンス化することはできますか?
std::unique_lock<std::mutex>(mutex);
:
std::unique_lock<std::mutex> lock(mutex);
すなわち、ローカル変数の代わりに名前のない一時変数を作成します。一時変数はすぐに破棄され、ミューテックスのロックを早めに解除します。
は、インスタンスgperftools (line 321-324) headerを参照してください:
// Catch bug where variable name is omitted, e.g. MutexLock (&mu);
#define MutexLock(x) COMPILE_ASSERT(0, mutex_lock_decl_missing_var_name)
#define ReaderMutexLock(x) COMPILE_ASSERT(0, rmutex_lock_decl_missing_var_name)
#define WriterMutexLock(x) COMPILE_ASSERT(0, wmutex_lock_decl_missing_var_name)
このマクロは再び、このようなユースケースを保護するために書かれています。
でも、それでも起こりますか?どうやら最近の十分なGCCまたは打ち鳴らすは、この場合にはエラーを生成します:
#include <iostream>
class Mutex {};
class Lock {
public:
explicit Lock(Mutex */* dummy */) { std::cout << __PRETTY_FUNCTION__ << std::endl; }
~Lock() { std::cout << __PRETTY_FUNCTION__ << std::endl; }
};
int main() {
Mutex mutex;
{
Lock l(&mutex);
}
{
Lock(&mutex); // This line does not compile.
}
return 0;
}
とエラー:
g++ foo.cpp
foo.cpp:17:11: error: declaration of reference variable 'mutex' requires an initializer
Lock(&mutex);
^~~~~
1 error generated.
誰かが、そのようなマクロが本当のバグをキャッチしますREPRO場合を示してもらえますか?私はこれまでのところ思い付くことができませんでした。
おそらく関連:http://stackoverflow.com/questions/914861/disallowing-creation-of-the -temporary-objects – BenC