如何使用boost::mutex作为std::map中的映射类型

How to use a boost::mutex as the mapped type in std::map?

本文关键字:映射 类型 map 作为 何使用 boost mutex std      更新时间:2023-10-16

我想在另一个映射中锁定密钥/索引,如下所示:

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不一起工作。我做错了什么?

在C++11之前的C++中,调用operator[]时,std::map的映射类型必须既是默认可构造类型,也是复制可构造类型。然而,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删除了映射类型是可复制构造的要求。

Map需要一个复制构造函数,但不幸的是boost::mutex没有公共复制构造函数。Mutex声明如下:

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

我认为向量也不起作用,它应该有同样的问题。你能把push_backboost::mutex转换成矢量吗?