C++ 寻找一个函数(或宏)来返回boost::scoped_锁

C++ 寻找一个函数(或宏)来返回boost::scoped_锁,c++,function,boost,shortcut,scoped-lock,C++,Function,Boost,Shortcut,Scoped Lock,我正在寻找代码缩短的想法。我正在使用boost::scoped_lock锁定boost::mutex,但我想缩短我正在编写的代码量 目前,我在类中定义了一个互斥体,成员字段名为\u sync。当我想锁定时,我必须写: scoped_lock<mutex> lock(_sync); 作用域锁定(同步); 棘手的是这是一个作用域锁,因此我假设如果我编写一个静态函数来返回作用域锁,那么一旦它离开静态函数的函数作用域,它就会解锁: static scoped_lock<mutex&

我正在寻找代码缩短的想法。我正在使用
boost::scoped_lock
锁定
boost::mutex
,但我想缩短我正在编写的代码量

目前,我在类中定义了一个
互斥体,成员字段名为
\u sync
。当我想锁定时,我必须写:

scoped_lock<mutex> lock(_sync);
作用域锁定(同步);
棘手的是这是一个作用域锁,因此我假设如果我编写一个静态函数来返回作用域锁,那么一旦它离开静态函数的函数作用域,它就会解锁:

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
}
public void对象::modify()
{
lock(_sync);//
#定义锁(a)作用域_lock作用域lockvar(a)
公共void对象::modify()
{

LOCK(_sync);//我本以为你的锁会被编译掉

锁定范围的点是它存在于本地,所以必须在本地声明它。我认为C++中没有一种方法可以绕过这个宏(它只是将代码隐藏在别处)。 我想使用typedef,那么每个人都知道你在做什么

typedef scoped_lock<mutex> lock; //at the start of your class
lock l(_sync); //in your function.
typedef作用域锁定;//在类的开头
在函数中锁定l(_sync);//。
我不认为这很糟糕……

不要

键入
范围锁定锁定(\u sync)时
阅读您的代码的每个人都知道发生了什么,如果您在了解代码两年后查看代码,您也会知道。懒惰通常不是创建实现的好动机。除非您想要强制使用,否则您需要编写此表达式的地方不止数百个,不要这样做


在你写问题所花的时间,你花在思考如何做的时间,以及我们所有人回答你问题所花的时间中,你可能已经写了所有的
范围锁定(\u sync)
这是您需要的。特别是如果您使用IDEs补全支持的话。

为什么不用一个简短的名称键入def
scoped\u lock
?这样可以很容易地键入。@Lirik:好的。现在我明白了,我已经删除了我的一半对话,因为您似乎没有破坏封装。@Martin…我删除了所有的注释以简化e混乱。
\u lockVar
是一个。@GMan:Oops,我不知道…改变了它。我知道我应该避免变量名开头的2。@Yochai:名称中任何地方的两个连续下划线,而不仅仅是开头,都是非法的。只是为示例随机命名一个变量…完全删除了下划线。@nemo@GMan
\definelock(a)scoped#LOCK scopedLockVar##a(a)
谢谢你的支持,不要傻了,你会怎么改进它?我之所以想这样做,是因为我在C#上做了很多开发工作,这里99%的人也在C#上工作。在C#上,你叫
LOCK(#sync){…}<代码>大家都知道发生了什么事情,这很简单。有了这个快捷方式,就可以看到C++代码少的“外国”(而且它更快地输入)。我曾经有过这样的TyPufF。但是我一直滥用它:<代码>锁(AySyc)< /C> >,它锁定并立即解锁。然后我创建了一个宏,就像Yochai Timmer一样。
typedef scoped_lock<mutex> lock; //at the start of your class
lock l(_sync); //in your function.