我正在寻找代码缩短的想法。我正在使用boost::scoped_lock
来锁定boost::mutex
,但我想缩短我正在编写的代码量。
目前我的班级中定义了mutex
,成员字段名为_sync
。当我想要锁定时,我必须写:
scoped_lock<mutex> lock(_sync);
棘手的部分是这是一个范围内的锁,所以我假设如果我编写一个静态函数来返回scoped_lock,那么一旦它离开静态函数的函数范围它就会解锁:
static scoped_lock<mutex> lock(mutex& sync)
{
return scoped_lock<mutex>(sync);
}
这种方法可以很容易地输入:
public void Object::modify()
{
lock(_sync); // <-- nice and short! ;)
// do something to modify the object
//..
// the mutex is unlocked when we leave the scope of modify
}
我的假设是否正确? scoped_lock
在我的静态函数返回时会立即解锁吗?
答案 0 :(得分:6)
不要......
当您输入scoped_lock<mutex> lock(_sync)
时,每个阅读代码的人都知道发生了什么,如果您在知道两年后查看代码,也会知道。懒惰通常是创建实施的不良动机。除非您想要强制使用,否则只需要编写此表达式的数百个地方,就行不知道了
在您写这个问题的时间,以及您花时间思考如何做的时间,以及我们所有人回答您的问题所花费的时间,您可能已经写了所有{ {1}}你需要的。特别是如果您正在使用IDE完成支持。
答案 1 :(得分:4)
#define LOCK(a) scoped_lock<mutex> scopedLockVar(a)
public void Object::modify()
{
LOCK(_sync); // <-- nice and short! ;)
// do something to modify the object
//..
// the mutex is unlocked when we leave the scope of modify
}
您应该为定义使用安全名称...编译器只使用find和replace来定义...
答案 2 :(得分:3)
我原本以为你的锁会被完全编译掉。
作用域锁定的关键在于它存在于本地,因此您必须在本地声明它。我不认为有一种方法可以在没有宏的情况下在c ++中解决这个问题(只是将代码隐藏在其他地方)。
我估计使用typedef,然后每个人都知道你在做什么。
typedef scoped_lock<mutex> lock; //at the start of your class
lock l(_sync); //in your function.
我认为这不是那么糟糕......