【问题标题】:Looking for a function (or a macro) to return a boost::scoped_lock寻找返回 boost::scoped_lock 的函数(或宏)
【发布时间】:2011-07-20 21:44:15
【问题描述】:

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

目前我在我的班级中定义了一个mutex 和名为_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
}

我的假设正确吗? scoped_lock 在我的静态函数返回时会立即解锁吗?

【问题讨论】:

  • 你为什么不用短名称键入def scoped_lock&lt;mutex&gt;?这使得打字变得容易。
  • @Lirik:好的。现在我知道我已经删除了我的一半对话,因为你似乎没有破坏封装。
  • @Martin... 我删除了所有的 cmets 以减少混乱。

标签: c++ function boost shortcut scoped-lock


【解决方案1】:

不要……

当您键入scoped_lock&lt;mutex&gt; lock(_sync) 时,每个阅读您的代码的人都知道发生了什么,如果您在两年后查看您的代码,您也会知道。懒惰通常是创建实现的不良动机。除非您想强制使用,否则需要编写此表达式的地方不止数百个,请不要这样做

在您写出问题所花费的时间,以及您思考如何做的时间,以及我们所有人回答您的问题所花费的时间,您可能已经写了所有@您需要的 987654322@。特别是如果您正在使用 IDE 完成支持。

【讨论】:

  • 感谢您的支持,不要装傻,您将如何改进它?
  • 我之所以要这样做,是因为我在 C# 中进行了大量开发工作,而且在这里工作的 99% 的人也在使用 C# 工作。在 C# 中,您调用 lock(_sync){...} 并且每个人都知道发生了什么,这非常简单。使用此快捷方式可以减少查看 C++ 代码的“外来”代码(并且输入速度更快)。
【解决方案2】:
#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
}

你应该为定义使用一个安全的名字...编译器只是使用查找和替换来定义...

【讨论】:

  • __lockVar 是reserved identifier。
  • @GMan :糟糕,不知道...改了。知道我应该避免在变量名的开头使用 2 __。
  • @Yochai : 名称中任何位置的两个连续下划线,不仅仅是开头,是非法的。
  • 只是为示例随机命名一个变量...完全删除了下划线..
  • @nemo @gman #define LOCK(a) scoped_lock&lt;mutex&gt; scopedLockVar##a(a)
【解决方案3】:

我原以为你的锁会被完全编译掉。

作用域锁的要点是它存在于本地,所以你必须在本地声明它。我不认为没有宏可以在 c++ 中解决这个问题(它只是将代码隐藏在其他地方)。

我估计使用 typedef,然后每个人都知道你在做什么。

typedef scoped_lock<mutex> lock; //at the start of your class
lock l(_sync); //in your function.

我不认为这很糟糕......

【讨论】:

  • 我曾经有过这样的 typedef。但我一直这样滥用它:lock(_sync),它会锁定并立即解锁。然后我像 Yochai Timmer 一样创建了一个宏。
猜你喜欢
  • 2011-01-17
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多