如何使用boost::mutex作为std::map中的映射类型
How to use a boost::mutex as the mapped type in 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
不一起工作。我做错了什么?
在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_back
和boost::mutex
转换成矢量吗?
相关文章:
- 值到类型的运行时映射
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 如何将高维数据映射到特征类型?
- 如何使映射键具有两种不同的数据类型?
- 值和类型的简洁双向静态 1:1 映射
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 编译按映射类型获取元素的映射错误元组
- 模板.参数包扩展 - 重映射类型
- C++函数来返回基于参数的比较器通用映射类型?
- ATL ActiveX DLL 作为映射类型图像和数据加载了两次
- 如何在 C++ 中获取映射类型指针,映射
- 映射类型为的队列容器
- 如何使用boost::mutex作为std::map中的映射类型
- 正向声明映射的映射类型和C++11
- std::map何时调用映射类型的构造函数
- 基于映射类型c++解析和转换csv
- 模板类的映射类型签名(声明)
- c++映射类型的属性
- 使用映射类型会产生GCC错误:预期的未限定id在' for '之前
- 在 EIGEN 中单独声明和初始化映射类型矩阵