2016-04-07 20 views
5

私はこのような別のマップに/インデックスのキーをロックしたい:std::vectorで動作するようですstd :: mapのマップされた型としてboost :: mutexを使う方法?

/usr/include/c++/4.8/bits/stl_pair.h:113: error: no matching function for call to 'boost::mutex::mutex(const boost::mutex&)' 
     : first(__a), second(__b) { } 
          ^

はなく、持つ:

std::map<int, boost::mutex> pointCloudsMutexes_; 
pointCloudsMutexes_[index].lock(); 

しかし、私は次のエラーを取得していますstd::map。私は間違って何をしていますか?

+2

ミューテックスのマップが有効な解決策であるという設計上の決定に至った要件は不思議です。おそらくあなたが望むものを達成するためのよりエレガントな方法があります。 –

+0

同時ハッシュマップ – Raaj

+0

このデザインは、同時ハッシュマップではありません。 mutexの非同期マップとなります。マップ全体をラップし、1つのミューテックスで保護する必要があります。 –

答えて

4

operator[]を呼び出すときに、std::mapのマップ型は、デフォルト-構成可能とコピー構築可能の両方でなければなりません。しかし、boost::mutexは、mutexをコピーするセマンティクスがどのようなものであるべきかは一般に不明であるため、コピーコンストラクタブルではないように明示的に設計されています。 boost::mutexがコピー可能でないため、pointCloudsMutexes_[index]を使用したそのような値の挿入はコンパイルに失敗します。

最適な回避策は、例えば、マップされた型としてboost::mutexにいくつかの共有ポインタを使用することである。

#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/thread/mutex.hpp> 
#include <map> 

struct MyMutexWrapper { 
    MyMutexWrapper() : ptr(new boost::mutex()) {} 
    void lock() { ptr->lock(); } 
    void unlock() { ptr->unlock(); } 
    boost::shared_ptr<boost::mutex> ptr; 
}; 

int main() { 
    int const index = 42; 
    std::map<int, MyMutexWrapper> pm; 
    pm[index].lock(); 
} 

PS:C++ 11は、コピー構築可能であることがマップされたタイプの必要性を除去します。

+0

あなたは '' C++ 11はマップされた型がコピーコンストラクタブルであるという要件を取り除いたので、作者のコードはC++ 11でコンパイルするべきですか? –

+0

@AlexeyAndronovはい。質問からのコード例を試しましたが、インデックスが 'int'のときにコンパイルします。 – jotik

+0

私はMSVS2015 update2で​​は 'std :: map'と' std :: mutex'を使っていませんでした。 –

1

マップにはコピーコンストラクタが必要ですが、残念ながらboost::mutexにはパブリックコピーコンストラクタがありません。ミューテックスは、以下のように宣言しました:

class mutex 
{ 
private: 
    pthread_mutex_t m; 
public: 
    BOOST_THREAD_NO_COPYABLE(mutex) 

私はベクターがどちらかといえばうまく動作しない、同じ問題があるはずです。 push_backboost::mutexさんへのベクトルができますか? C++ 11の前にC++で

+0

ミューテックスミューテックスはコピーできないというのは「不運」ではありません。それは非常に幸運です。これは、移動してはならない基礎となるデータ構造を表します。 –

+0

@リチャード私は同意します:) –

関連する問題