簡體   English   中英

在const函數中使用boost :: mutex :: scoped_lock

[英]Using boost::mutex::scoped_lock inside const function

此代碼將無法編譯:

    class MyClass
    {
        boost::mutex _mutex; 

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

但是將函數定義為非const將正常工作。 請問有人可以解釋原因嗎? 謝謝!

你不能在const-member函數中鎖定互斥鎖,因為它實際上修改了互斥lock的內部狀態( lock本身不是const函數)。

如果你想保持函數const ,你必須將互斥量聲明為mutable ,這是一個允許const函數修改它的cv限定符,即

//can now be locked (i.e. modified) by a const function
mutable boost::mutex _mutex;

使用mutable放松對使用此限定符聲明的成員變量的const約束,這是一種繞過constness的方法,所以小心不要濫用它。 在這種情況下,它似乎是合理的,因為互斥體是類的內部工具,並且不參與“邏輯常量”(與“按位常量”相反)。

這段代碼應該編譯

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

Raistmaj是對的。

原因是常量方法保證它不會更改其類實例。 通過聲明互斥鎖可變,您為該變量設置了一個例外。

出現此問題的原因是boost::mutex::scoped_lock的構造函數調用的boost::mutex::lock() 不是 const成員函數。 由於互斥鎖是MyClass的成員,這意味着無法從MyClass的非const成員函數調用MyClass::_mutex::lock()

解決方案是將互斥鎖聲明為mutable成員。 這向編譯器表明即使在const成員函數中也可以修改_mutex

class MyClass
{
    mutable boost::mutex _mutex; 

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

請你能解釋為什么它不起作用。 鎖定_mutex是'修改'嗎?

確切地說,_mutex對象會將其內部狀態從“解鎖”狀態更改為“已鎖定”狀態。 因此,您需要mutable關鍵字fora const-function來保留函數的邏輯const,同時允許互斥體可修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM