Я использую межпроцессную библиотеку бустов для разделения памяти между несколькими программами. 3 или 4 другие программы будут читать и записывать содержимое общей памяти в cust_order. Доступ к пространству памяти должен быть сериализован.
В приведенном ниже примере программы движок перебирает содержимое параметра risk_queue и, если он заполнен, берет первый номер cust_order и находит этот заказ для обработки.
в заголовочном файле objects.h, используемом каждой программой:
struct cust_order {
int ID;
char CLID[128];
int CUST_ID;
char ORDER_STATUS;
};
cust_order o;
boost::interprocess::managed_shared_memory
cust_order_segment(boost::interprocess::open_or_create, "cust_order",
65536 * 100);
typedef int cust_order_KeyType;
typedef cust_order cust_order_MappedType;
typedef std::pair<const int, cust_order> cust_order_ValueType;
typedef boost::interprocess::allocator<
cust_order_ValueType,
boost::interprocess::managed_shared_memory::segment_manager>
cust_order_ShmemAllocator;
typedef boost::interprocess::map<cust_order_KeyType, cust_order_MappedType,
std::less<cust_order_KeyType>,
cust_order_ShmemAllocator>
cust_order_MySHMMap;
cust_order_MySHMMap::iterator cust_order_iter;
boost::interprocess::managed_shared_memory
risk_queue_segment(boost::interprocess::open_or_create, "risk_queue",
65536 * 100);
typedef int risk_queue_KeyType;
typedef int risk_queue_MappedType;
typedef std::pair<const int, int> risk_queue_ValueType;
typedef boost::interprocess::allocator<
risk_queue_ValueType,
boost::interprocess::managed_shared_memory::segment_manager>
risk_queue_ShmemAllocator;
typedef boost::interprocess::map<risk_queue_KeyType, risk_queue_MappedType,
std::less<risk_queue_KeyType>,
risk_queue_ShmemAllocator>
risk_queue_MySHMMap;
risk_queue_MySHMMap::iterator risk_queue_iter;
в engine.cpp:
int main() {
risk_queue_ShmemAllocator risk_queue_alloc_inst(
risk_queue_segment.get_segment_manager());
cust_order_ShmemAllocator cust_order_alloc_inst(
cust_order_segment.get_segment_manager());
for (; 0 < 1;) {
boost::interprocess::offset_ptr<risk_queue_MySHMMap> risk_queue_m_pmap =
risk_queue_segment.find<risk_queue_MySHMMap>("risk_queue").first;
boost::interprocess::offset_ptr<cust_order_MySHMMap> cust_order_m_pmap =
cust_order_segment.find<cust_order_MySHMMap>("cust_order").first;
risk_queue_iter = risk_queue_m_pmap->begin();
if (risk_queue_iter != risk_queue_m_pmap->end()) {
ordid = risk_queue_iter->second;
cust_order_m_pmap->find(ordid)->second = o;
o.ORDER_STATUS = '0';
o = cust_order_m_pmap->find(ordid)->second;
risk_queue_m_pmap->erase(ordid);
}
};
return 0;
}
Это ошибка, которую я получаю после нескольких секунд работы программ:
engine: /usr/include/boost/intrusive/bstree.hpp:1331: boost::intrusive::bstree_impl<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, SizeType, ConstantTimeSize, AlgoType, HeaderHolder>::iterator boost::intrusive::bstree_impl<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, SizeType, ConstantTimeSize, AlgoType, HeaderHolder>::insert_unique_commit(boost::intrusive::bstree_impl<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, SizeType, ConstantTimeSize, AlgoType, HeaderHolder>::reference, const insert_commit_data&) [with ValueTraits = boost::intrusive::bhtraits<boost::container::container_detail::tree_node<std::pair<const int, event>, boost::interprocess::offset_ptr<void>, (boost::container::tree_type_enum)0, true>, boost::intrusive::rbtree_node_traits<boost::interprocess::offset_ptr<void>, true>, (boost::intrusive::link_mode_type)0, boost::intrusive::dft_tag, 3>; VoidOrKeyOfValue = void; VoidOrKeyComp = boost::container::value_to_node_compare<boost::container::container_detail::tree_node<std::pair<const int, event>, boost::interprocess::offset_ptr<void>, (boost::container::tree_type_enum)0, true>, boost::intrusive::tree_value_compare<boost::interprocess::offset_ptr<std::pair<const int, event>, long int, long unsigned int, 0>, std::less<int>, boost::container::container_detail::select1st<int>, false> >; SizeType = long unsigned int; bool ConstantTimeSize = true; boost::intrusive::algo_types AlgoType = (boost::intrusive::algo_types)5; HeaderHolder = void; boost::intrusive::bstree_impl<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, SizeType, ConstantTimeSize, AlgoType, HeaderHolder>::iterator = boost::intrusive::tree_iterator<boost::intrusive::bhtraits<boost::container::container_detail::tree_node<std::pair<const int, event>, boost::interprocess::offset_ptr<void>, (boost::container::tree_type_enum)0, true>, boost::intrusive::rbtree_node_traits<boost::interprocess::offset_ptr<void>, true>, (boost::intrusive::link_mode_type)0, boost::intrusive::dft_tag, 3>, false>; boost::intrusive::bstree_impl<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, SizeType, ConstantTimeSize, AlgoType, HeaderHolder>::reference = boost::container::container_detail::tree_node<std::pair<const int, event>, boost::interprocess::offset_ptr<void>, (boost::container::tree_type_enum)0, true>&; boost::intrusive::bstree_impl<ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, SizeType, ConstantTimeSize, AlgoType, HeaderHolder>::insert_commit_data = boost::intrusive::insert_commit_data_t<boost::interprocess::offset_ptr<boost::intrusive::compact_rbtree_node<boost::interprocess::offset_ptr<void> >, long int, long unsigned int, 0> >]: Assertion `( p == this->end() || !this->comp()(*p, value) )' failed.
Aborted (core dumped)
Пожалуйста, не могли бы вы помочь мне понять ошибку. И дайте мне знать, если есть лучший способ сделать то, что мне нужно.