マルチスレッド アプリケーションに存在するリソース格納オブジェクトがあります。(できれば) スレッド セーフを確保するために、リソースにアクセスしたり、新しいリソースを挿入したりするたびにミューテックスをロックします。たとえば、新しいリソースを挿入するには:
void ResourceManager::insertResource(const std::string& id)
{
// create the object with such ID
Resource res = Resource(id);
// ... more code on res
// lock the mutex to insert the resource
std::lock_guard<std::mutex> guard(mResourcesMutex);
// insert the resource in a STL container
mResources.insert(ResourceContainer::value_type(id, res));
// ... more code that does not require the mutex lock
}
そのデストラクタができるだけ早く呼び出され、他のスレッドがリソースにアクセスできるように、lock_guard のスコープを最小限に抑えたいと考えています。特に、mResources.insert(...) ステートメントの後にミューテックスのロックを解除したいと思います。
単純な if ステートメントを使用して lock_guard のスコープを設定することを考えました。
if(true)
{
std::lock_guard<std::mutex> guard(mResourceMutex);
mResources.insert(ResourceContainer::value_type(id, res);
}
しかし、それが機能しているかどうかはわかりません。これがlock_guardを正しくスコープしているのか、それともコンパイラが私がおかしいと思ってifステートメントを取り出してコードを最適化しているのかを確認するのは難しいと思います。
私の質問は次のとおりです。
- これは稼働していますか?
- その価値はありますか?パフォーマンスへの影響はありますか?
- より良い代替手段はありますか?