问题标签 [boost-interprocess]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在持有 boost::interprocess::scoped_lock 时休眠会导致它永远不会被释放
我正在使用参考(匿名互斥锁示例)在Linux上进行IPCboost::interprocess::shared_memory_object
。
有一个服务器进程,它创建shared_memory_object
并写入它,同时将一个interprocess_mutex
包裹在一个scoped_lock
;中。和一个客户端进程,它打印另一个人写的任何东西——在这种情况下,它是一个int
.
我遇到了一个问题:如果服务器在持有互斥锁时休眠,则客户端进程永远无法获取它并永远等待。
错误的服务器循环:
服务器输出:
客户端循环:
客户端输出(永远等待):
问题是,如果我将括号移到sleep
通话前的那一行,一切正常。为什么?我不认为与锁定的互斥锁一起睡觉会导致互斥锁永远被锁定。
我唯一的理论是,当内核唤醒服务器进程时,作用域结束并释放互斥锁,但等待进程没有机会运行。然后服务器重新获取锁......但这似乎没有多大意义。
谢谢!
c++ - 如何获得废弃的 boost::interprocess::interprocess_mutex 的所有权?
我的场景:一台服务器和一些客户端(虽然不多)。服务器一次只能响应一个客户端,因此必须排队。我正在使用互斥锁 ( boost::interprocess::interprocess_mutex
) 来执行此操作,包裹在boost::interprocess::scoped_lock
.
问题是,如果一个客户端在持有互斥锁时意外死亡(即没有析构函数运行),其他客户端就会遇到麻烦,因为它们正在等待该互斥锁。我考虑过使用定时等待,所以如果我的客户端等待 20 秒并且没有获得互斥锁,它会继续与服务器对话。
这种方法的问题:1)它每次都这样做。如果它处于循环中,不断与服务器通信,则每次都需要等待超时。2)如果有三个客户端,其中一个在持有互斥锁时死亡,另外两个将等待 20 秒并同时与服务器通信——这正是我试图避免的。
那么,我怎么能对客户说,“嘿,看来这个互斥体已被放弃,拥有它”?
c++ - boost interprocess : 共享内存和 stl 类型
我有一个简单的结构:
我把它放在共享内存中:
如果与共享内存通信的两个应用程序是使用不同版本的 Visual Studio(不同版本的 stl 实现)构建的,我应该将本机类型(例如 char*)而不是 stl 类型放在共享内存中吗?
编辑:
我试过了
它有效!
c++ - 共享内存、MPI 和排队系统
我的 unix/windows C++ 应用程序已经使用 MPI 进行了并行化:作业在 N 个 cpus 中拆分,每个块并行执行,非常高效,速度扩展非常好,工作做得很好。
但是有些数据在每个过程中都是重复的,并且由于技术原因,这些数据不能轻易地通过 MPI 拆分(...)。例如:
- 5 Gb 的静态数据,为每个进程加载完全相同的数据
- 可以在 MPI 中分发的 4 Gb 数据,使用的 CPU 越多,每个 CPU 的 RAM 越小。
在 4 CPU 作业中,这意味着至少需要 20Gb RAM 负载,大部分内存“浪费”,这太糟糕了。
我正在考虑使用共享内存来减少整体负载,“静态”块每台计算机只会加载一次。
所以,主要问题是:
是否有任何标准的 MPI 方法可以在节点上共享内存? 某种现成的+免费图书馆?
- 如果没有,我将
boost.interprocess
使用 MPI 调用来分发本地共享内存标识符。 - 共享内存将由每个节点上的“本地主机”读取,并且共享只读。不需要任何类型的信号量/同步,因为它不会改变。
- 如果没有,我将
有任何性能下降或需要注意的特定问题吗?
- (不会有任何“字符串”或过于奇怪的数据结构,一切都可以归结为数组和结构指针)
该作业将在 PBS(或 SGE)排队系统中执行,在进程不干净退出的情况下,我想知道这些是否会清理节点特定的共享内存。
string - 共享内存和字符串:托管?
boost::interprocess::string
我在共享内存中 有问题。
当我使用 a 时,shared_memory_object
我可以操纵具有不同字段的结构,但字符串(我得到一个分段错误)。
另一方面,当我使用managed_shared_memory
一切都很好。
难道我做错了什么?你知道使用 是否有性能损失managed_shared_memory
?
谢谢!
timeout - 提升进程间匿名条件 timed_wait 不可编译
我想知道我做错了什么......wait
它编译和运行的鞋底,但不是timed_wait
:
[...]
哪里obj->mutex
是 aboost::interprocess::interprocess_mutex
并且obj->condition
是 a boost::interprocess::interprocess_condition
。这是 g++ 错误日志:
而这是条件类成员函数的原型(boost/interprocess/sync/interprocess_condition.hpp):
(提升 1.40)
c++ - 使用 Boost 在共享内存中创建循环缓冲区时出现问题
我正在尝试使用 Boostcircular_buffer
和 Interprocess 库在共享内存中创建一个循环缓冲区。我编译并运行了Interprocess 文档中给出的示例,用于在共享内存中创建向量,没有问题。但是,当我修改它以使用 Boost circular_buffer 作为:
我得到一个编译错误(由 引起segment.construct()
)。知道我做错了什么吗?是不是因为circular_buffer
不是 中列出的容器之一/boost/interprocess/containers
,即它与 Interprocess 不兼容?
谢谢,
C
c++ - boost.interprocess 中共享内存的 memcpy 问题
这让我感到沮丧。我只是想创建一个共享内存缓冲区类,该类在通过 Boost.Interprocess 创建的共享内存中使用,我可以在其中读取/存储数据。我写了以下内容来测试功能
当我运行它时,它写入数据正常,但memcpy
在读取循环中的第一个出现段错误。gdb 说:
程序收到信号 EXC_BAD_ACCESS,无法访问内存。原因:KERN_INVALID_ADDRESS 在地址:0x0000000000000000 0x00007fffffe007c5 in __memcpy()
(gdb) 在哪里
#0 0x00007fffffe007c5 in __memcpy () #1 0x0000000100000e45 in main (argc=1, argv=0x7fff5fbff9d0) at try.cpp:36
功能如此简单,我不知道我错过了什么。任何帮助都感激不尽。
c++ - 为什么创建由不同进程共享的环形缓冲区如此困难(在 C++ 中),我做错了什么?
我对此特别密集,但似乎我错过了一个重要的基本点或其他东西,因为我想做的事情应该是常见的:
我需要从管理器进程 ( Process M
) 创建一个固定大小的环形缓冲区对象。该对象具有从缓冲区写入/读取的方法write()
。read()
读/写方法将由独立进程(Process R
和W
)调用
我已经实现了缓冲区,SharedBuffer<T&>
它使用 boost::interprocess 在 SHM 中分配缓冲区插槽,并在单个进程中完美运行。我已经阅读了这个问题的答案以及关于 SO 的答案,以及我自己的问题,但我仍然对如何从一个公共对象有不同的进程访问方法一无所知。Boost 文档有一个在 SHM 中创建向量的示例,这与我想要的非常相似,但我想实例化我自己的类。
我目前的选择是:
new
正如 Charles B. 对我的问题所建议的那样,使用放置位置;但是,他警告说,将非 POD 对象放在 SHM 中并不是一个好主意。但是我的班级需要读/写方法,我该如何处理?- 在我的类定义中添加一个分配器,例如,拥有
SharedBuffer<T&, Alloc>
并继续类似于boost 中给出的向量示例。这听起来真的很复杂。 - 更改
SharedBuffer
为 POD 类,即去掉所有方法。但是那么如何在进程之间同步读写呢?
我错过了什么?固定长度的环形缓冲区很常见,所以要么这个问题有解决方案,要么我做错了什么。
c++ - 在共享内存中使用自定义分配器实例化类
由于以下问题,我正在拉扯我的头发:我正在按照boost.interprocess 文档中给出的示例来实例化我在共享内存中编写的固定大小的环形缓冲区缓冲区类。我的类的骨架构造函数是:
我的第一个问题:这种分配是否保证缓冲区节点分配在连续的内存位置,即当我尝试从m_start_ptr + n*sizeof(BufferNode)
我的Read()
方法中的地址访问第 n 个节点时它会起作用吗?如果没有,有什么更好的方法来保留节点,创建一个链表?
我的测试工具如下:
这给了我与最后一条语句的模板相关的各种编译错误。我究竟做错了什么?segment.construct<MyBuf>("MyBuffer")(100, alloc_inst)
提供两个模板参数的正确方法是什么?