2012-02-14 34 views
10

我有一個奇怪的錯誤。助推互斥奇怪的錯誤與私人會員

class INST 
{ 
public: 
boost::mutex m_mutex; 
}; 

std::vector<INST> m_inst; 

錯誤C2248: '提高::互斥::互斥體':不能訪問類 '的boost ::互斥體' 聲明爲private成員 看到的宣言 '提高::互斥::互斥體'

不過,我的其他班很好,

class VIEW 
{ 
public: 
boost::mutex m_mutex; 
}; 

VIEW m_view; 

我在這裏錯過了什麼嗎?我試圖將m_mutex聲明爲private,但仍然有同樣的問題。

謝謝。

+0

C++錯誤通常很複雜且冗長。確保你複製了完整的錯誤信息(可能是多個錯誤XXX:行),因爲每一行都會向謎題添加一些信息(在這種情況下,可能是因爲它是複製構造函數不可用或它在定義複製構造函數時發現錯誤 – 2012-02-14 21:33:19

+0

謝謝David,我是多線程編程的新手,能否請您提出解決方案?我有一個共享向量,並且有幾個線程可以訪問向量的不同部分 – 2607 2012-02-14 21:37:48

回答

18

互斥對象不能是copied,所以你不能把它們放在一個容器裏,它會複製互斥量。該錯誤很可能是指互斥體的私有拷貝構造函數。

+0

謝謝nos,你能爲這個問題提出一個解決方案嗎?我有一個共享向量,並且有幾個線程可以同時訪問向量的不同部分。 – 2607 2012-02-14 21:32:52

+0

互斥體的位置(智能)指針或者在容器中包含互斥體的類,或者用一個互斥體保護整個向量(或者如果數組適合您的任務,則使用數組) – nos 2012-02-14 21:38:13

+0

請糾正我f我錯了,如果我使用全局互斥來保護整個向量,是否意味着一次只有一個線程可以訪問整個向量?我試圖讓多個線程同時訪問向量的不同部分。謝謝。 – 2607 2012-02-14 21:43:13

2

我意識到這個問題確實很古老,但今天早些時候我偶然發現了同樣的問題,並且Google在這裏引導我。但是,提出的解決方案不適合我,所以我想描述我是如何在自己的項目中解決這個問題的。

我有一個像你一樣的類的向量,我以這種方式管理這些類,以便一旦訪問向量的成員開始,矢量就不會再被調整大小。儘管如此,在開始處理之前,我確實希望能夠在開始時重新調整向量幾次。我也想讓線程以隨機存取的方式在矢量中的任何項目上運行。

我通過在類的構造函數中動態分配它,並在析構函數中銷燬它,解決了互斥鎖的問題。當然,如果你這樣做,你必須保證沒有人在刪除它時等待互斥體。這個解決方案適用於我,因爲我從不將對象從矢量中複製出來,我只能在容器內訪問它們。