c++ - 提升共享内存映射分配器错误
问题描述
我正在尝试在 boost 中创建一个共享内存管理器映射,以及该映射的同步类。我之前对向量做了大致相同的事情,并且效果很好。我在使用地图时收到标题中提到的错误。我做这一切都错了吗?此仓库中的代码
同步类:
#include <iostream>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/sync/interprocess_condition.hpp>
#include <boost/interprocess/sync/interprocess_mutex.hpp>
#include <boost/thread/lock_guard.hpp>
namespace node_cluster_cache {
using namespace boost;
using namespace boost::interprocess;
using std::pair;
typedef uint64_t int64;
typedef uint32_t int32;
typedef std::array<int32, SIZE> msg_arr;
typedef std::array<char, ACCESS_SIZE> access_name;
template<class T>
class SynchronizedMap {
public:
typedef allocator<T, managed_shared_memory::segment_manager> allocator_type;
typedef lock_guard<interprocess_mutex> lock;
private:
map<access_name, T, allocator_type> _map;
mutable interprocess_mutex io_mutex;
mutable interprocess_condition wait_condition;
public:
SynchronizedMap(allocator_type alloc) : _map(alloc) {};
void insert(const access_name name, T msg_part) {
lock _lock(io_mutex);
_map.insert(pair<access_name, T>(name, msg_part));
}
int32 size() const {
lock _lock(io_mutex);
return _map.size();
}
bool empty() const {
lock _lock(io_mutex);
return _map.empty();
}
void clear() {
lock _lock(io_mutex);
_map.clear();
}
bool erase(access_name name) {
lock _lock(io_mutex);
return _map.erase(name);
}
bool erase(typename map<access_name, T>::iterator it) {
lock _lock(io_mutex);
return _map.erase(it);
}
};
};
消息结构:
struct Message {
int64 bit_no;
int64 pid;
int64 part_no;
int64 size;
msg_arr data;
Message() {}
Message(int64 bn, int64 p, int64 pn, int64 s, msg_arr& d) {
bit_no = bn;
pid = p;
part_no = pn;
size = s;
safe_copy(data, d);
}
Message(int64 bn, int64 p, int64 s, msg_arr& d) {
bit_no = bn;
pid = p;
part_no = 0;
size = s;
safe_copy(data, d);
}
};
template<size_t N>
static inline void safe_copy(std::array<int32, N>& dst, std::array<int32, N>& src) {
#undef min
std::copy_n(src.data(), std::min(src.size(), N), dst.data());
dst.back() = 0;
}
创建和使用如下:
this->shmem = new managed_shared_memory(create_only, "node_cluster_cache", SHMEM_SIZE);
this->alloc_inst = new SynchronizedMap<Message>::allocator_type(this->shmem->get_segment_manager());
this->cache_map = this->shmem->construct<SynchronizedMap<Message> >("data_vector")(*(this->alloc_inst));
msg_arr test{ 123,456,789 };
access_name name = { 't', 'e', '\0' };
int64 a = 1;
int64 b = 2;
Message c(a, b, 4, test);
this->cache_map->insert(name, c);
错误本身:
Severity Code Description Project File Line Suppression State
Error C2664
'node_cluster_cache::SynchronizedMap<node_cluster_cache::Message>::SynchronizedMap
(const node_cluster_cache::SynchronizedMap<node_cluster_cache::Message> &)': cannot convert argument 1 from
'boost::interprocess::allocator<T,boost::interprocess::segment_manager<CharType,MemoryAlgorithm,IndexType>>' to 'const
node_cluster_cache::SynchronizedMap<node_cluster_cache::Message> &' node-cluster-cache
C:\boost_1_74_0\boost\interprocess\detail\named_proxy.hpp 85
解决方案
将 allocator_type 更改为值对并为 std::array<char, ACCESS_SIZE> 定义比较器解决了该问题。
typedef pair<const access_name, T> value_type;
typedef allocator<value_type, managed_shared_memory::segment_manager> allocator_type;
struct cmp_str {
bool operator()(access_name a, access_name b) const {
for (int i = 0; ; i++) {
if (a[i] != b[i]) {
return a[i] < b[i] ? -1 : 1;
}
if (a[i] == '\0') {
return 0;
}
}
}
};
map<access_name, T, cmp_str, allocator_type> _map;
推荐阅读
- flutter - 如何在颤振中使用 BLOB 构造函数
- mysql - 如何在 Sequelize 关联两个表
- r - 通过变量值控制 ggplot 线宽
- intellij-idea - 如何在 Mac 上关闭单个 JetBrains IDE?
- firebase - Firebase 存储和 Cloud Firestore/实时数据库有什么区别?
- python - python:如何将json转换为数据框
- python - 用 Python 保存数据帧字典的最佳文件格式是什么?
- ssl - 谷歌云平台静态网站 SLL 问题
- ruby-on-rails - 设计验证用户名的存在
- scala - 在 Scala 中将日期字符串转换为日期