2

This code won't compile:

    class MyClass
    {
        boost::mutex _mutex; 

        void foo() const
        {
          boost::mutex::scoped_lock lock(_mutex);
         //critical section
        }
    }

But defining the function as non const will work fine. Please, can someone explain why? Thanks!

4

5 に答える 5

1

Raistmajは正しいです。

その理由は、定数メソッドがそのクラス インスタンスを変更しないことを保証するためです。ミューテックスをミュータブルと宣言することで、その変数の例外を作成します。

于 2015-03-19T14:25:42.773 に答える
1

この問題はboost::mutex::lock()、 のコンストラクターによって呼び出される がメンバー関数ではないために発生しboost::mutex::scoped_lockますconstミューテックスは のメンバであるため、 の非メンバ関数から呼び出すMyClassことMyClass::_mutex::lock()はできません。constMyClass

解決策は、ミューテックスをmutableメンバーとして宣言することです。これは、メンバー関数_mutexであっても変更される可能性があることをコンパイラに示します。const

class MyClass
{
    mutable boost::mutex _mutex; 

    void foo() const
    {
      boost::mutex::scoped_lock lock(_mutex);
     //critical section
    }
}
于 2015-03-19T14:27:06.367 に答える
0

うまくいかなかった理由を教えてください。_mutex のロックは「変更」ですか?

正確には、_mutex オブジェクトは内部状態を「ロック解除」状態から「ロック」状態に変更します。したがって、ミューテックスを変更可能にしながら、関数の論理定数を保持するには、const-function の mutable キーワードが必要です。

于 2015-03-19T14:58:28.577 に答える