Boost进程间共享内存故障
Boost interprocess shared memory trouble
我正在使用Boost的进程间共享内存访问。
我想做的是在共享内存中存储一个映射,并从跨进程访问。下面是我尝试做同样事情的部分代码——
SharedMemoryManager.h
#ifndef SHARED_MEMORY_MANAGER_H
#define SHARED_MEMORY_MANAGER_H
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/sync/named_semaphore.hpp>
#include <boost/interprocess/containers/map.hpp>
enum RangeBound { START, END, SINGLE };
typedef struct {
std::string code;
RangeBound flag;
} ZipRangeInfo;
typedef std::string RangeKeyType;
typedef std::pair<const RangeKeyType, ZipRangeInfo> RangeValueType;
typedef boost::interprocess::allocator<RangeValueType, boost::interprocess::managed_shared_memory::segment_manager> RangeBasedShmemAllocator;
typedef boost::interprocess::map<RangeKeyType, ZipRangeInfo, std::less<RangeKeyType>, RangeBasedShmemAllocator> SharedRangeBasedMap;
class SharedMemoryManager {
private:
static boost::interprocess::managed_shared_memory *segment;
static RangeBasedShmemAllocator *alloc_range_map;
public:
static char* get_range_based_routing_code(char *dataItem, char *fileName);
static SharedRangeBasedMap* get_range_based_routing_table(char *fileName );
static void load_range_based_routing_table( const char *fileName );
};
#endif //SHARED_MEMORY_MANAGER_H
和SharedmemoryManager.cpp
#include "SharedMemoryManager.h"
const std::string shm_code_util("SharedMemoryUtil");
//Initializing shared memory of size 1 GB.
boost::interprocess::managed_shared_memory *SharedMemoryManager::segment =
new boost::interprocess::managed_shared_memory(
boost::interprocess::open_or_create, "CRS", 1024 * 1024 * 1024);
RangeBasedShmemAllocator *SharedMemoryManager::alloc_range_map =
new RangeBasedShmemAllocator(segment->get_segment_manager());
// Method definitions
char* SharedMemoryManager::get_range_based_routing_code(char *dataItem,
char *fileName) {
char* result = NULL;
// Postal Code Scrubbing Logic
if (dataItem == NULL)
return NULL;
try {
char *dataIt = (char *) calloc(strlen(dataItem) + 1, sizeof(char));
strcpy(dataIt, dataItem);
SharedRangeBasedMap *routing_table = get_range_based_routing_table(
fileName);
std::cout << "Hash Table Size :" << routing_table->size();
if (routing_table != NULL && routing_table->size() > 0) {
RangeKeyType key(dataItem);
SharedRangeBasedMap::const_iterator routing_entry =
routing_table->lower_bound(key);
std::cout << "Got iterator";
if (routing_entry == routing_table->end()) {
return NULL;
}
if (routing_entry->first == key
|| routing_entry->second.flag == END) {
result = (char *) routing_entry->second.code.c_str();
}
}
free(dataIt);
return result;
} catch (std::exception &e) {
throw;
}
}
SharedRangeBasedMap* SharedMemoryManager::get_range_based_routing_table(
char *fileName) {
boost::interprocess::named_semaphore sync_semaphore(
boost::interprocess::open_or_create, "LoadFilesSemaphore", 1);
sync_semaphore.wait();
try {
SharedRangeBasedMap *routing_table = segment->find_or_construct<
SharedRangeBasedMap>(fileName)(std::less<RangeKeyType>(),
*alloc_range_map);
if (routing_table->size() == 0) {
load_range_based_routing_table(fileName);
}
sync_semaphore.post();
return routing_table;
} catch (...) {
std::cout << "An exception was thrown; couldn't load post codes.";
sync_semaphore.post();
return NULL;
}
return NULL;
}
void SharedMemoryManager::load_range_based_routing_table(const char *fileName) {
SharedRangeBasedMap *range_based_map = NULL;
range_based_map = segment->find_or_construct<SharedRangeBasedMap>(
fileName)(std::less<RangeKeyType>(), *alloc_range_map);
// Build the hash if empty
if (range_based_map != NULL && range_based_map->size() == 0) {
//logic to populate the map - tested to work correctly
}
}
我面临的问题是,第一个调用get_range_based_routing_code
的进程,从而初始化共享内存并填充映射,能够从映射中检索值,而任何后续调用get_range_based_routing_code
都会遇到分段错误。
通过添加cout
语句,我已经能够推断出下面的行是导致错误的行(或者是执行的最后一行)——
SharedRangeBasedMap::const_iterator routing_entry =
routing_table->lower_bound(key);
我很难弄清楚这个问题,而且我在c++方面的经验不足也没有帮助。
您也必须使密钥类型从共享内存区域分配。
有许多Boost IPC示例为此目的定义了shared_string
。你可以重复使用这个
对于ZipRangeInfo
类型中的std::string
也是如此。是的,这是大量的工作和麻烦。在实践中,您可能希望将ZipRangeInfo::code
替换为一些静态大小的boost::array<char, ...>
或char[N]
相关文章:
- 当新的故障时,是否有必要留出一些紧急内存?
- 带升压的 SEG 故障::make_shared / 特征3 内存.h.
- 需要帮助对内存泄漏源进行故障排除 - C++
- 内存集分段故障内核转储
- 将内存分配给指针数组时SEG故障
- 插入std :: basic_ostream实例化输出时的内存故障
- 分割内存位置后,将内存分配给MALLOC()时分割故障
- Linux共享内存,带有C :分段故障
- 低内存会导致本机代码中的SEG故障
- 向量交换的向量中的分割故障,将内存分配给指针为向量的向量
- C noExcept对于不引发异常的函数,可能会导致内存故障
- 我在C中简单程序中的内存故障
- 谁处理C++ "new"内存分配故障?
- 安全使用 vector.emplace_back( 新的 MyPointer );矢量内部的故障是否会导致内存泄漏
- 使用常量字符*时出现内存故障
- 正在从内存不足故障中恢复
- "detects_simple_anagram"中的致命错误:地址 0x00000000 处的内存访问冲突:故障地址处没有映射
- 内存耗尽会导致分段故障吗?
- C++ 模板功能<queue>中的内存故障
- Boost进程间共享内存故障