草庐IT

interprocess

全部标签

c++ - boost::interprocess 线程安全吗?

目前,我有2个进程使用message_queue和shared_memory表单boost进行通信。一切如常。现在我需要使这个进程中的一个成为多线程的(再次感谢boost),我想知道我是否需要在线程之间使用保护机制(例如互斥锁),或者boost::interprocess库是否已经存在提供保护机制?我没有在boost文档中找到任何相关信息。顺便说一下,我使用的是boost1.40。提前致谢。 最佳答案 来自boost::interprocess的共享资源(共享内存等)要求您提供必要的同步。这样做的原因是您可能不需要同步,而且它通常在

c++ - 如何返回一个不透明的句柄(void* 或 dword),它可以转换回存储在 boost::interprocess 映射中的值元素?

我对放置一个std::string键和一个大的struct值所涉及的堆和按值与按引用语义有点困惑放入像boost::interprocess::map这样的容器中。这是我的情况,以及我正在使用的一些类型定义:typedefstd::stringAreaKeyType;typedefDATA_AREA_DESCAreaMappedType;//DATA_AREA_DESCisabigstruct.typedefstd::pairAreaValueType;typedefboost::interprocess::allocatorAreaShmemAllocator;typedefboos

c++ - 我如何获得废弃的 boost::interprocess::interprocess_mutex 的所有权?

我的场景:一台服务器和一些客户端(虽然不多)。服务器一次只能响应一个客户端,因此他们必须排队。我正在使用互斥量(boost::interprocess::interprocess_mutex)来执行此操作,它封装在boost::interprocess::scoped_lock中。问题是,如果一个客户端在持有互斥量时意外死亡(即没有析构函数运行),其他客户端就会有麻烦,因为它们正在等待该互斥量。我考虑过使用定时等待,所以如果我的客户端等待20秒但没有获得互斥锁,它会继续与服务器通信。这种方法的问题:1)它每次都这样做。如果它处于循环中,不断与服务器对话,则每次都需要等待超时。2)如果有

c++ - 带有 LD_PRELOAD 和 boost::interprocess 的 mmap() 不起作用

我正在尝试通过LD_PRELOAD替换预先确定的fd上的原始mmap()系统调用,以便调用它的进程可以读取共享内存对象之前由另一个进程使用boost::interprocess创建。一切顺利,除了当我最终尝试读取mmap内存时。在这种情况下,第一个进程会因段错误而中止。可能是什么原因?我不需要共享内存对象的写权限。这是预加载库中的代码:void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset){staticvoid*(*o_mmap)(void*,size_t,int,int,int,off_t)=o_mm

c++ - 使用 Boost::interprocess 在共享内存中映射 <int, void*>

我正在尝试在以下类型的共享内存中构造一个映射我这样创建共享内存区域:managed_shared_memorysegment(create_only,"MyMap",size);ShMemAllocator_talloc_inst(segment.get_segment_manager());map=segment.construct("MyMap")(std::less(),alloc_inst);map中的值如下:typedefpair>ValueType;MutexType本身是一个包含读取和写入互斥量的结构(使用read_lock和write_lock);定义如下:typede

c++ - boost::interprocess::managed_shared_memory 在不同版本的 boost 之间的兼容性

是否有明确的兼容性保证boost::interprocess::managed_shared_memory可以跨不同的boost版本工作?我打算用它在多个进程之间共享一个整数或十(这实际上将充当它们都读取和写入的一段数据的修订号)。这些进程是单独发布的,并且偶尔会终止使用。问题是:我是否会因为1.51中的managed_shared_memory无法与1.44中的managed_shared_memory进行对话而将自己永远锁定在给定的boost版本上? 最佳答案 根据BoostFAQ:HowcantheBoostlibraries

c++ - 如何调试或修复涉及 boost::interprocess managed_shared_memory 的无限循环和堆损坏问题?

我收到以下“第一次机会异常”消息,该消息来self编写的DLL,该DLL在我未编写的可执行文件中运行。也就是说,DLL是一个插件。第一次触发此异常时,尝试打开共享内存映射文件失败。如果我忽略第一次机会异常而只是运行,应用程序最终会卡住或崩溃。First-chanceexceptionat0x76a7c41finnotmyexe.exe:MicrosoftC++exception:boost::interprocess::interprocess_exceptionatmemorylocation0x002bc644..几个小时后,它似乎是由一段无限循环的代码块引起的,直到预期的异常条件

c++ - boost::interprocess::named_mutex 与 CreateMutex

我想从CreatMutex切换到boost::interprocess::named_mutex以将我的应用程序限制为单个实例。当应用程序正常运行和结束时,这两种方法都有效。但是,当应用程序崩溃并使用boost::interprocess::named_mutex时,锁不会被释放。我可以通过使用两个name_mutex来解决这个问题,但我真的不明白这个问题。为什么boost::interprocess::named_mutex的锁在应用程序崩溃时没有释放,但它是通过CreatMutex释放的?有什么区别?boost::interprocess::named_mutexmutex(boo

c++ - C++ 程序的单个实例,使用 boost::interprocess

我有一个控制台应用程序,我试图让它一次只能运行一次。我已经使用boost进程间库shared_memory_object来做到这一点。请参阅下面的代码片段,boost::scoped_ptrsharedMem;try{sharedMem.reset(newshared_memory_object(create_only,"shared_memory",read_write));}catch(...){//executableisalreadyrunningcerr问题是,该方法阻止我的应用程序同时运行多次;但是,假设用户停止程序运行,那么内存将不会被释放,下次用户再次尝试运行程序时,程