2

我正在寻找代码缩短的想法。我boost::scoped_lock用来锁定 aboost::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当我的静态函数返回时会立即解锁吗?

4

3 回答 3

6

不 ...

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

在你写下问题所花费的时间,你花在思考如何去做的时间,以及我们所有人回答你的问题所花费的时间,你可能已经写出了scoped_lock<mutex> lock(_sync)你需要的所有东西。特别是如果您正在使用 IDE 完成支持。

于 2011-07-20T22:21:18.510 回答
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
}

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

于 2011-07-20T21:53:27.427 回答
3

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

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

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

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

我不认为这有那么糟糕......

于 2011-07-20T21:58:31.770 回答