我正在使用boost::interpocess::scoped_locka named_mutex和a timeout; 我在Linux OS中运行.
在我的一次测试中,我遇到了崩溃:从那时起,每当我再次尝试运行应用程序时,它就会卡在我创建锁的位置; 看起来互斥体仍然以某种方式获得(没有可能使用它的进程正在运行).
最重要的是,如果你看下面的代码,我希望在150微秒后,定时scoped_lock返回给我一个错误..但事实并非如此......只是挂在那里.
#include <boost/interprocess/sync/named_mutex.hpp>
namespace bi = boost::interprocess;
bi::named_mutex m_mutex;
try{
boost::posix_time::ptime pt(
boost::posix_time::microsec_clock::local_time() ) ;
pt+= boost::posix_time::microseconds( 150 );
bi::scoped_lock< bi::named_mutex > lock( m_mutex, pt );
if( !lock.owns() ){
FATAL( "I didn't acquire the lock." );
return EXIT_FAILURE;
}
....
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
boost::interprocess命名的互斥锁被销毁?(那么如何在进程中查看共享的互斥锁以及如何销毁它们)非常感谢
AFG
我正在尝试使用 Boost 和 Interprocess 库在共享内存中创建循环缓冲区circular_buffer。我编译并运行了进程间文档中给出的示例,用于在共享内存中创建向量,没有任何问题。但是,当我修改它以使用 Boostcircular_buffer 时:
int main(int argc, char *argv[])
{
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
const ShmemAllocator alloc_inst (segment.get_segment_manager());
MyCircBuffer *myCircBuf = segment.construct<MyCircBuffer>("MyCircBuffer")(alloc_inst);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到编译错误(由 引起segment.construct())。知道我做错了什么吗?是否是因为circular_buffer不是 中列出的容器之一/boost/interprocess/containers,即它与 Interprocess 不兼容?
谢谢,
C
我实际上是尝试使用boost :: serialize序列化boost :: function,因为我想在boost :: interprocess :: message_queue中共享它.我只看到一种方法,它是使用非侵入式版本的boost :: serialize.
namespace boost {
namespace serialization {
template<class Archive>
void serialize(Archive & ar, boost::function<void()> & fct, const unsigned int version)
{
ar & fct.args;
ar & fct.arity;
ar & fct.vtable;
ar & fct.functor;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还需要序列化vtable和functor,我没有尝试过,我不确定它是否正常工作.
那么有没有办法以正确的方式序列化boost :: function?
谢谢.
c++ boost boost-serialization boost-interprocess boost-function
目前,我有2个进程使用message_queue和shared_memory表单进行通信.一切都像参加了一样工作.
现在我需要使这个进程中的一个多线程(再次感谢boost),我想知道是否需要在线程之间使用保护机制(例如mutex),或者如果boost :: interprocess库已经提供了保护机制?
我没有在boost文档中找到任何关于它的信息.顺便说一句,我正在使用boost 1.40.
提前致谢.
我有一个简单的要求可能很难解决.我确实找到了一些像这样或者这样的引线,但我似乎无法自述使用它们.前者甚至没有为我翻译成可构建的代码.我对Boost没有经验只是自己写这个,但在我看来这可能是一个常见的要求.
我也遇到过Interprocess STL Map,但我还没有把它组装成工作代码.
我想boost::interprocess是去的地方,除非我想从头开始创建一些共享内存映射.
我不关心便携性.我需要一个适用于MS编译器的解决方案,特别是VS 2010附带的解决方案.
这张海报似乎想要或多或少地想要做什么,除了我需要将GUID映射到任意长度的二进制缓冲区(但是int到字符串同样好作为起点).不幸的是,即使从实验开始,我也无法干净地编译代码.
此外,我有两个问题:A)是否可以自动(或至少可预测)增加/缩小共享内存以满足分配需求; B)假设一个进程创建映射,另一个进程如何"附加"它?
我不介意解决方案是否需要多个共享"段"以满足分配需求.它不一定必须是单个单片共享内存块.
任何帮助都非常感谢.
我正在创建一个程序,它将从远程计算机接收消息,并需要将消息写入磁盘上的文件.我发现的困难在于这个程序的目的是测试接收消息的库的性能,因此,我需要确保将消息写入磁盘不会影响库的性能.该库通过回调函数将消息传递给程序.另一个困难是解决方案必须与平台无关.
我有什么选择?
我想到了以下几点:
boost:asio写入文件,但似乎(见本文档),以文件异步写入是在该库的Windows特定的部分-所以这不能使用.boost::interprocess创建一个消息队列,但这个文件表明,有3种方法,其中的信息可以发送,并且所有的方法将需要程序来阻止(隐含与否)如果消息队列已满,我不能冒险.std::deque<MESSAGES>从回调函数推送到deque,并在写入文件时(在单独的线程上)弹出消息,但不保证 STL容器是线程安全的.我可以锁定推进,然后弹出deque但我们正在谈论连续消息之间的47微秒,所以我想完全避免锁定.有没有人对可能的解决方案有任何想法?
c++ multithreading thread-safety boost-asio boost-interprocess
在C++中,使用boost :: interprocess可以定义一个boost :: interprocess :: basic_string,它基本上是一个存储在内存映射文件中的字符串的抽象.您可以像应用程序中的任何其他字符串一样无缝地使用它(当然假设您负责线程安全).
C#是否有任何等效的库/ nuget包/代码片段?
我想要的是使用名为ShmObj的类访问托管共享内存对象的数据信息,其中指向共享对象的原始指针作为私有成员,如下面的代码块.
我的问题是主程序分段错误.我猜绝对原始指针会导致问题.我试图将原始指针更改为bi :: offset_ptr,但没有帮助.任何帮助表示赞赏.
ShmObj.h
#include <string>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace bi = boost::interprocess;
class ShmObj {
public:
ShmObj() {
bi::managed_shared_memory segment(bi::open_only, "shm");
pNum = segment.find<int>("Number").first;
}
int getNumber() {return *pNum;}
virtual ~ShmObj() {}
private:
int* pNum;
};
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "ShmObj.h"
#include <iostream>
int main() {
ShmObj X;
std::cout << X.getNumber() << std::endl;
}
Run Code Online (Sandbox Code Playgroud) 我目前正在查看Boost的进程间库的文档,并试图弄清楚它们之间的区别.
从我可以说,唯一的区别是持久性(当最后一个进程退出时释放Windows共享内存,只有在被告知时才释放managed_shm),是否存在其他差异,如速度或我错过了?
我正在考虑自定义对象的进程间共享。我当前的实现使用 ZeroMQ,其中对象被打包成一条消息并从进程 A 发送到进程 B。
我想知道使用 boost::interprocess 实现并发容器是否会更快(其中进程 A 将插入到容器中,进程 B 将从中检索)。不确定这是否比在进程 A 中序列化对象然后在进程 B 中反序列化它更快。
只是想知道是否有人做过基准测试?比较两者在概念上是否正确?