2012-02-14 6 views
10

私は奇妙なエラーがあります。ミューテックスのプライベートメンバーとのミューテックスの奇妙なエラー

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

std::vector<INST> m_inst; 

エラーC2248: '後押し:: mutexを::ミューテックス':プライベートメンバにアクセスすることはできませんが、クラス内で宣言 'ブースト::ミューテックス' の宣言見る '後押し:: mutexを::ミューテックス'

しかし、他のクラスは問題ありません。

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

VIEW m_view; 

私はここに何か不足していますか?私はm_mutexをprivateに宣言しようとしましたが、それでも同じ問題があります。

ありがとうございました。

+0

通常、C++エラーは複雑で冗長です。完全なエラーメッセージ(複数のエラーXXX:行かもしれない)をコピーするようにしてください。各行はパズルに少しの情報を追加します(この場合はおそらくコピーコンストラクタが利用できないか、コピーコンストラクタの定義中にエラーが見つかりました –

+0

Davidさん、マルチスレッドプログラミングの初心者ですね。問題の解決策を提案してください。共有ベクトルがあり、いくつかのスレッドがベクトルの別の部分にアクセスする可能性があります – 2607

答えて

18

mutexesはcopiedになることはできません。したがって、mutexをコピーするコンテナにそれらを配置することはできません。このエラーは、おそらくmutexのプライベートコピーコンストラクタを参照している可能性があります。

+0

ありがとうございます、問題の解決策を提案できますか?共有ベクトルがあり、複数のスレッドが同時にベクトルの異なる部分にアクセスする可能性があります。 – 2607

+0

ミューテックスのための(スマートな)ポインタの配置コンテナ内のmutexを含むクラス、または1つのmutexでベクトル全体を保護する(または、あなたのタスクに適した配列を使用する) – nos

+0

私を修正してくださいfグローバルミューテックスを使ってベクター全体を保護すると、一度に1つのスレッドしかベクトル全体にアクセスできないということは間違っていますか?私は複数のスレッドが同時にベクトルの異なる部分にアクセスできるようにしようとしています。ありがとうございました。 – 2607

2

私はこの質問が本当に古くなっていることを認識していますが、今日の同じ問題に直面してGoogleがここで私をリードしています。しかし、提案された解決策は私には適していなかったので、自分のプロジェクトでどのように解決したのか説明したかったのです。

私は、あなたのようなクラスのベクトルを持っています。そして、これらのメソッドを管理して、ベクトルのメンバーへのアクセスが開始されると、ベクトルは決して再びサイズ変更されません。ただし、処理が始まる前に、開始時に数回ベクトルのサイズを変更する機能が必要です。私はまた、スレッドがランダムアクセスの方法でベクトル内の項目のいずれかを操作できるようにしたかったのです。

私はmutexの問題を、クラスのコンストラクタで動的に割り当て、デストラクタで破棄することで解決しました。もちろん、これを行うと、削除するときに誰もがmutexを待っていないことを保証する必要があります。私はベクトルからオブジェクトをコピーしないので、このソリューションは私のために働く、私はコンテナの内部にのみアクセスします。

関連する問題