- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近我got schooled并学习了在 boost::interprocess::managed_shared_memory
段中使用 unordered_map
的正确方法。到目前为止一切顺利,但我需要添加更多的 STL 容器。
理想情况下,我希望能够对任何 STL 容器都遵循相同的做法。现在我需要一个 std::list
.我不能让它工作。我可以做一个std::vector
不过,工作。
以下代码有效:
#include <vector>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace ipc = boost::interprocess;
using Segment = ipc::managed_shared_memory;
using Manager = Segment::segment_manager;
template <typename T> using Alloc = ipc::allocator<T, Manager>;
template <typename K> using Vector = std::vector<K, Alloc<K>>;
int main() {
boost::interprocess::shared_memory_object::remove("test");
Segment _segment{ipc::create_only, "test", 1ul<<40};
Manager *mgr = _segment.get_segment_manager();
Vector<int> *v = _segment.construct<Vector<int>>("v")(mgr);
v->emplace_back(1);
}
列表等效代码会导致错误。
#include <list>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace ipc = boost::interprocess;
using Segment = ipc::managed_shared_memory;
using Manager = Segment::segment_manager;
template <typename T> using Alloc = ipc::allocator<T, Manager>;
template <typename K> using List = std::list<K, Alloc<K>>;
int main() {
boost::interprocess::shared_memory_object::remove("test");
Segment _segment{ipc::create_only, "test", 1ul<<40};
Manager *mgr = _segment.get_segment_manager();
List<int> *v = _segment.construct<List<int>>("v")(mgr);
v->emplace_back(1);
}
编译标志(使用 g++-7)和错误如下:
$ g++ -std=gnu++17 lol_list.cpp -lrt -pthread -rdynamic -Wfatal-errors && ./a.out && rm ./a.out
In file included from /usr/include/c++/7/list:63:0,
from lol_list.cpp:1:
/usr/include/c++/7/bits/stl_list.h: In instantiation of ‘std::__cxx11::list<_Tp, _Alloc>::_Node* std::__cxx11::list<_Tp, _Alloc>::_M_create_node(_Args&& ...) [with _Args = {int}; _Tp = int; _Alloc = boost::interprocess::allocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >; std::__cxx11::list<_Tp, _Alloc>::_Node = std::_List_node<int>]’:
/usr/include/c++/7/bits/stl_list.h:1801:32: required from ‘void std::__cxx11::list<_Tp, _Alloc>::_M_insert(std::__cxx11::list<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {int}; _Tp = int; _Alloc = boost::interprocess::allocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >; std::__cxx11::list<_Tp, _Alloc>::iterator = std::_List_iterator<int>]’
/usr/include/c++/7/bits/stl_list.h:1133:4: required from ‘std::__cxx11::list<_Tp, _Alloc>::reference std::__cxx11::list<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {int}; _Tp = int; _Alloc = boost::interprocess::allocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >; std::__cxx11::list<_Tp, _Alloc>::reference = int&]’
lol_list.cpp:16:20: required from here
/usr/include/c++/7/bits/stl_list.h:578:11: error: cannot convert ‘boost::interprocess::offset_ptr<std::_List_node<int>, long int, long unsigned int, 0>’ to ‘std::__cxx11::list<int, boost::interprocess::allocator<int, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> > >::_Node* {aka std::_List_node<int>*}’ in return
return __p;
^~~
compilation terminated due to -Wfatal-errors.
错误仍然存在于 g++-6
或 g++-8
甚至 clang-6.0
和 clang-5.0
.
最佳答案
并非所有标准库实现都完全支持有状态分配器(还?)。
在这种情况下,您的 std::list<>
似乎没有。只需选择用于 Boost Container 的那个,它也可以通过 Boost Interprocess header 方便地获得:
#include <boost/interprocess/containers/list.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace ipc = boost::interprocess;
using Segment = ipc::managed_shared_memory;
using Manager = Segment::segment_manager;
template <typename T> using Alloc = ipc::allocator<T, Manager>;
template <typename K> using List = ipc::list<K, Alloc<K>>;
int main() {
boost::interprocess::shared_memory_object::remove("test");
Segment _segment{ipc::create_only, "test", 1ul<<40};
Manager *mgr = _segment.get_segment_manager();
List<int> *v = _segment.construct<List<int>>("v")(mgr);
v->emplace_back(1);
}
关于c++ - std::list 在 boost::interprocess::managed_shared_memory 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51883848/
有没有人尝试创建进程间通信的日志文件?有人可以就实现这一目标的最佳方式给我一些建议吗? 最佳答案 这个问题不太清楚,评论使它不太清楚,但无论如何...... 首先要尝试的两件事是 ipcs和 stra
我使用boost::interprocess在共享内存中创建了boost::multi_index数据结构。有许多客户端进程将访问此数据结构。访问时,我将锁定数据结构。我遇到的问题是,一旦客户端进程正
我正在尝试使用 this 创建内存映射文件回答,但我收到编译错误。这是我的代码: namespace bi = boost::interprocess; std::string vecFile = "
我正在编写实时数据以增加共享内存。最初我每次想访问 shm 时都使用它: boost::interprocess::managed_shared_memory segment(boost::inte
我正在查看两个进程共享互斥锁和条件变量的 Boost 示例代码: https://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/synchro
我刚刚读了this page Boost.Interprocess 文档。这似乎表明,为了适应不同操作系统之间的差异并达成某种共识,某些进程间机制并没有使用操作系统提供的直接对应的本地机制来实现,而是
我有以下崩溃的代码。我怀疑这是因为分配了对堆栈的引用,所以我遇到了这个问题。但我想避免每次都必须堆栈分配互斥锁和作用域锁的成本 class Cache { public: void cr
在 Boost.Interprocess 文档中 Where is this being allocated?据称 Boost.Interprocess 容器同时使用两种机制放置在共享内存中: Boo
我已经在这个问题上待了好几天(甚至在 boost 论坛上的 posted)并且能够让第二个进程识别锁定的互斥锁似乎不起作用。请帮忙。这是代码: 通用头文件:SharedObject.hpp #ifnd
我正在使用 boost::interprocess::named_upgradable_mutex 来同步一些进程。 我正在使用 boost::interprocess::sharable_lock
我搜索在两个进程之间共享一个结构。但我没有成功。你能帮忙理解吗? 这是我的第一个过程的代码: #include #include #include #include #include #in
我正在移植源代码以打开/读取/写入在多个进程之间共享的文件。它在 Windows 下运行良好,因为它主要使用 boost::interprocess (1.44),我没想到会有太多问题,但我发现了一些
我想我终于掌握了 boost:interprocess 库的基础知识,并且在处理包含一些全是标准数据类型的成员变量的相对简单的类时,我一直在成功地使用它。 但是,我现在面临着将一个相当复杂的类推送到进
现在查看此链接: http://www.boost.org/doc/libs/1_56_0/doc/html/interprocess/quick_guide.html#interprocess.qu
我想用 boost 编写一个简单的应用程序,将字符串对象传递给其他进程。它编译得很好,但是当我尝试从第二个进程打印出字符串时,以下消息被发送到控制台并且第二个进程崩溃: ../boost_1_44_0
目前,我有 2 个进程使用 message_queue 和 shared_memory 表单 boost 进行通信。一切如常。 现在我需要使这个进程中的一个成为多线程的(再次感谢 boost),我想知
我需要围绕一个硬件进行进程间同步。因为此代码需要在 Windows 和 Linux 上运行,所以我使用 Boost 进程间互斥锁进行封装。一切正常接受我检查互斥量放弃的方法。这有可能发生,所以我必须为
这是一段我用来在共享内存上分配映射的代码,我正在使用boost::interprocess和托管共享内存段,现在的问题是我遇到了内存泄漏。下面给出的是最高输出。 最高输出: PID USER
我有一个应用程序实现了 boost named_mutex 以锁定 C++ 项目 (Visual Studio) 中的多个模块。我需要不惜一切代价删除所有 boost 依赖项。 还有其他方法可以实现吗
我似乎遇到了 boost::interprocess::file_lock 的问题 我的流程 1 本质上是 boost::interprocess::file_lock test_lock("
我是一名优秀的程序员,十分优秀!