2016-04-07 7 views
5

Я хотел бы, чтобы заблокировать ключи/индекс в другой карте, как это:Как использовать boost :: mutex как отображаемый тип в std :: map?

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

Однако, я получаю следующее сообщение об ошибке:

/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::vector, но не с std::map. Что я делаю не так?

+2

Непонятно, какие требования привели к конструктивному решению о том, что карта мьютексов является допустимым решением. Вероятно, есть намного более элегантный способ добиться того, чего вы хотите. –

+0

Консолидация hashmap – Raaj

+0

Этот дизайн не будет одновременной картой хэша. Это будет неконкурентная карта мьютексов. Вам нужно обернуть всю карту и защитить ее всего одним мьютексом. –

ответ

4

В C++, прежде чем C++ 11, отображенный тип std::map должен быть как по умолчанию, конструктивны и копирования конструктивны, при вызове operator[]. Тем не менее, boost::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 да. Просто попробовал пример кода из вопроса, и он компилируется, когда index является 'int'. – jotik

+0

он не на моем MSVS2015 update2 с 'std :: map' и' std :: mutex', хотя X_x –

1

Для карты требуется конструктор копирования, но, к сожалению, boost::mutex не имеет открытого конструктора копии. Мьютекс, указанный ниже:

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

Я не думаю, что вектор работает либо, он должен иметь такую ​​же проблему. Можете ли вы push_backboost::mutex в вектор?

+0

не является «неудачным», что мьютекс мьютекса не копируется - ему очень повезло. Он представляет собой базовую структуру данных, которую нельзя перемещать. –

+0

@Richard Я согласен :) –