2

コード短縮のアイデアを探しています。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静的関数によって返されたときにすぐにロックを解除しますか?

4

3 に答える 3

6

しないでください...

入力するとscoped_lock<mutex> lock(_sync)、コードを読んでいるすべての人が何が起こっているかを知っています。また、2年後のコードを見ればわかるでしょう。怠惰は通常、実装を作成するための悪い動機です。使用を強制したい場合を除き、この式を記述する必要がある場所が数百以上ある場合は、それを行わないでください。

質問を書き上げるのにかかった時間、その方法を熟考するのに費やした時間、そして私たち全員があなたの質問に答えるのにかかった時間で、あなたはおそらく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 に答える