【问题标题】:Mutex/Lock with scope/codeblock互斥/锁定与范围/代码块
【发布时间】:2014-04-10 08:48:52
【问题描述】:
我记得在某个会议上看到过,但找不到任何相关信息。
我想要类似的东西:
lock(_somelock)
{
if (_someBool)
return;
DoStuff();
} // Implicit unlock
代替:
lock(_somelock);
if (_someBool)
{
unlock(_somelock);
return;
}
DoStuff();
unlock(_somelock);
如您所见,由于多次提前返回,代码变得非常臃肿。
显然可以创建另一个函数来处理锁定/解锁,但它会更好吗?
可以使用 C++11 标准库吗?
【问题讨论】:
标签:
c++
multithreading
c++11
mutex
standard-library
【解决方案1】:
是的,您可以使用std::lock_guard 来包装互斥锁。
{
std::lock_guard<std::mutex> lock(your_mutex);
if (_someBool)
return;
DoStuff();
}
【解决方案2】:
标准习惯用法是使用一个保护对象,其生命周期包含互斥锁的锁定状态:
std::mutex m;
int shared_data;
// somewhere else
void foo()
{
int x = compute_something();
{
std::lock_guard<std::mutex> guard(m);
shared_data += x;
}
some_extra_work();
}
【解决方案3】:
您可以简单地创建自己的自动锁定。
Class AutoLock
{
pthread_mutex_t *mpLockObj;
AutoLock(pthread_mutex_t& mpLockObj)
{
mpLockObj = &mpLockObj;
pthread_mutex_lock(mpLockObj);
}
~AutoLock()
{
pthread_mutex_unlock(mpLockObj);
}
};
像这样使用:
#define LOCK(obj) AutoLock LocObj(obj);
int main()
{
pthread_mutex_t lock;
LOCK(lock);
return 0;
}