1

を呼び出しunlock()た後boost::recursive_mutex::scoped_lock、ロックオブジェクトはデストラクタで何らかの形でミューテックスを参照しますか?

ロックは、ロック解除の呼び出し後もミューテックスへの参照を保持します(つまりmutex()、同じポインターを返します)。release()ロックがスコープ外になる前にミューテックスが破壊された場合にも、ロックで呼び出す必要がありますか?

4

1 に答える 1

1

Boost1.42のunique_lockデストラクタのコードを見てみましょう。

    ~unique_lock()
    {
        if(owns_lock())
        {
            m->unlock();
        }
    }

ロックを所有している場合にのみ、(現在は無効な)ミューテックスへのポインターを逆参照しようとします。このscoped_lockですでにunlockを呼び出している場合は、この実装で問題が発生することはありません(可能性は低いですが、ライブラリの将来のバージョンで変更される可能性があります)。

ただし、依存オブジェクトが依存関係の前に破棄されるような順序でオブジェクトが破棄されるようにすることをお勧めします。これを保証できない場合は、当然のことながら、ミューテックスを破棄する前にロックでrelease()を呼び出す必要があります。

于 2011-03-11T15:20:15.920 に答える