2012-05-29 50 views
2

我在使用deque和boost :: mutex時遇到了一些麻煩,我做了一個簡單的例子,它將用下面的錯誤進行編譯。與std :: deque一起使用時,不能將Boost :: mutex作爲私有類成員?

問題是我想擁有一個具有一個或多個互斥體作爲私有成員的類。雖然目前的例子給出了一個錯誤:

錯誤C2248:「提高::互斥::互斥體」:不能訪問類「的boost ::互斥體」

聲明爲private成員,我已經看到了一些相關的職位,但這樣遠遠沒有設法解決這個具體問題。

任何幫助將不勝感激......

#include <iostream> 
#include <boost/thread.hpp> 
#include <deque> 

using namespace std; 

class object { 
public: 
    void process(void) 
    { 
     m_mutex.lock(); 
     // do something 
     a = a*10; 
     m_mutex.unlock(); 
    } 
    object(int v){ a = v; }   
private: 
    int a; 
    boost::mutex m_mutex; 
}; 

int main(int argc, char* argv[]) 
{ 
    deque<object> obj; 

    obj.push_back(object(1)); 
    obj.push_back(object(2)); 
    obj.push_back(object(3)); 

    obj.at(0).process(); 
    obj.at(1).process(); 
    obj.at(2).process(); 

    return 0; 
}; 
+1

你應該使用作用域鎖定類型而不是手動調用鎖定/解鎖 –

回答

3

如果您不想打擾編寫複製構造函數以避免複製互斥量,則可以使用Boost的Pointer Container

例如:

#include <boost/ptr_container/ptr_deque.hpp> 
... 
boost::ptr_deque<object> obj; 
obj.push_back(new object()); 
obj[0].process() 
... 

現在deque的行爲就像一個正常的雙端隊列,但它從來沒有嘗試複製任何object實例。

+0

這工作,是一個非常透明的解決方案。謝謝。 – AlexS

3

互斥量是不是可複製構造,因此形成不良的你的類型的拷貝構造函數。

您可以提供不復制互斥鎖的用戶定義的複製構造函數。

+0

嗨,我應該提到我已經從我讀過的帖子意識到這一點,但它怎麼能解決? – AlexS

+0

自定義副本構造函數的外觀如何?我不明白。 – AlexS

+0

通過在自定義副本構造函數中省略互斥鎖副本,可能會避免一個問題並創建另一個問題。如果一個線程獲得了鎖,另一個線程會對需要複製對象的'deque'做些什麼? – Praetorian

2

你不能複製互斥體,因此你也不能複製你的包含互斥體的類。作爲替代,你可以使unique_ptr秒的雙端隊列到類

std::deque<std::unique_ptr<object>> obj; 
+0

這看起來不錯,但它似乎不是VS2008下的選項,只在使用#include 的較新STL中 - 這聽起來正確嗎? – AlexS

+0

@AlexS您可以使用boost :: shared_ptr作爲停止解決方案。或者,由於您對這些對象的使用看起來很有本地化,所以原始指針可能是一個選項。 – juanchopanza

+0

@juanchopanza謝謝,但如果使用boost,似乎Inverse的解決方案是最直接的。 – AlexS

4
obj.push_back(object(1)); 

以上行創建,然後將其複製構建到雙端隊列元素的臨時object實例。由於boost::mutex不可複製,因此編譯器無法合成object的複製構造函數。

如果這是唯一的地方,你需要object是聲明拷貝構造變化

obj.emplace_back(1); 

emplace_back導致地方將建造的object實例,而不是使用拷貝構造。


如果您沒有訪問C++ 11個的特點,object類更改爲以下:

#include <memory> 

class object { 
public: 
    void process(void) 
    { 
     m_mutex->lock(); 
     // do something 
     a = a*10; 
     m_mutex->unlock(); 
    } 
    object(int v) 
    : m_mutex(std::make_shared<boost::mutex>()) 
    { 
     a = v; 
    }  

private: 
    int a; 
    std::shared_ptr<boost::mutex> m_mutex; 
}; 

在VS2008中,你可能需要使用std::tr1::shared_ptr代替。

相關問題