我有一个位于多线程应用程序中的资源存储对象。为了(希望)确保线程安全,我每次想要访问资源或插入新资源时都会锁定一个互斥锁。例如,插入一个新资源:
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 语句的代码。
我的问题是:
- 这管用吗?
- 这值得么?我会注意到性能下降吗?
- 有没有更好的选择?