7

私の短縮された単純化されたクラスは次のようになります。

class A
{
    public:
    // ...
    methodA();
    methodB();

    protected:
    mutable boost::mutex m_mutex;
    sometype*  m_myVar;
}

A::methodA( int someParam )
{
    boost::mutex::scoped_lock myLock(m_mutex);
    m_myVar->doSomethingElse();
}

A::methodB( int someParam )
{
    boost::mutex::scoped_lock myLock(m_mutex);
    m_myVar->doSomething();
    this->methodA(someParam);
}

へのアクセスを同期したいと思いますm_myVar。を呼び出すA::methodB()と、スレッドは同じミューテックスで2回ロックに遭遇し、明らかに最初の行でブロックしますA::methodA()

再度渡すときに同じスレッドscoped_lockをブロックしないようにする方法はありますか?

もちろん、私は単純に を呼び出すことができますm_mutex.unlock()。しかし、これにより、ロックを待機している他のスレッドも解放されます。これは、私が望んでいることではありません。

何か案が?

宜しくお願いします トバイアス

4

3 に答える 3

12

これboost::recursive_mutexにより、何度もデッドロックすることなく、同じスレッドでロックを取得できます。代わりに使用してくださいboost::mutex

于 2011-10-23T10:19:11.913 に答える
4

ここでできることはさまざまです。同じスレッド内で複数回取得できる再帰的ミューテックスを使用するかmethodA、実装を使用してロックを使用しないプライベート メソッドと、ロックしてからプライベート実装を呼び出すパブリック メソッドに分割できます。次にmethodB、ロックを保持しながら内部実装を呼び出します。メソッドはプライベートであるため、すべての使用を制御でき、ロックを保持している間のみ実装メソッドが呼び出されるようにすることができます。

于 2011-10-23T10:18:39.530 に答える
0

試行が失敗した場合、methodA で tryLock を使用できます。現在の threadId を取得し、スレッド ID が MethodB を実行するスレッド ID と同じである場合にのみ実行を続行する必要があります。

于 2011-10-23T09:57:49.120 に答える