标签: boost-interprocess

在崩溃后仍然获得了名为mutex的提升进程

我正在使用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)

我的问题如下:

  1. 如何确保boost::interprocess命名的互斥锁被销毁?(那么如何在进程中查看共享的互斥锁以及如何销毁它们)
  2. 为什么获取互斥锁不会在150微秒后返回?这下面的代码中有什么问题吗?

非常感谢

AFG

synchronization mutex ipc interprocess boost-interprocess

6
推荐指数
1
解决办法
2783
查看次数

使用 Boost 在共享内存中创建循环缓冲区时出现问题

我正在尝试使用 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

c++ circular-buffer boost-interprocess

5
推荐指数
1
解决办法
3296
查看次数

如何序列化boost :: function以在message_queue中发送它

我实际上是尝试使用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

5
推荐指数
1
解决办法
1157
查看次数

boost :: interprocess threadsafe?

目前,我有2个进程使用message_queue和shared_memory表单进行通信.一切都像参加了一样工作.

现在我需要使这个进程中的一个多线程(再次感谢boost),我想知道是否需要在线程之间使用保护机制(例如mutex),或者如果boost :: interprocess库已经提供了保护机制?

我没有在boost文档中找到任何关于它的信息.顺便说一句,我正在使用boost 1.40.

提前致谢.

c++ boost thread-safety boost-interprocess

5
推荐指数
1
解决办法
2395
查看次数

使用boost :: interprocess共享地图

我有一个简单的要求可能很难解决.我确实找到了一些像这样或者这样的引线,但我似乎无法自述使用它们.前者甚至没有为我翻译成可构建的代码.我对Boost没有经验只是自己写这个,但在我看来这可能是一个常见的要求.

我也遇到过Interprocess STL Map,但我还没有把它组装成工作代码.

我想boost::interprocess是去的地方,除非我想从头开始创建一些共享内存映射.

我不关心便携性.我需要一个适用于MS编译器的解决方案,特别是VS 2010附带的解决方案.

这张海报似乎想要或多或少地想要做什么,除了我需要将GUID映射到任意长度的二进制缓冲区(但是int到字符串同样好作为起点).不幸的是,即使从实验开始,我也无法干净地编译代码.

此外,我有两个问题:A)是否可以自动(或至少可预测)增加/缩小共享内存以满足分配需求; B)假设一个进程创建映射,另一个进程如何"附加"它?

我不介意解决方案是否需要多个共享"段"以满足分配需求.它不一定必须是单个单片共享内存块.

任何帮助都非常感谢.

c++ boost map shared-memory boost-interprocess

5
推荐指数
1
解决办法
8104
查看次数

如何实现平台无关的异步写入文件?

我正在创建一个程序,它将从远程计算机接收消息,并需要将消息写入磁盘上的文件.我发现的困难在于这个程序的目的是测试接收消息的库的性能,因此,我需要确保将消息写入磁盘不会影响库的性能.该库通过回调函数将消息传递给程序.另一个困难是解决方案必须与平台无关.

我有什么选择?

我想到了以下几点:

  • 使用boost:asio写入文件,但似乎(见文档),以文件异步写入是在该库的Windows特定的部分-所以这不能使用.
  • 使用boost::interprocess创建一个消息队列,但这个文件表明,有3种方法,其中的信息可以发送,并且所有的方法将需要程序来阻止(隐含与否)如果消息队列已满,我不能冒险.
  • 创建一个std::deque<MESSAGES>从回调函数推送到deque,并在写入文件时(在单独的线程上)弹出消息,但不保证 STL容器是线程安全的.我可以锁定推进,然后弹出deque但我们正在谈论连续消息之间的47微秒,所以我想完全避免锁定.

有没有人对可能的解决方案有任何想法?

c++ multithreading thread-safety boost-asio boost-interprocess

5
推荐指数
1
解决办法
1092
查看次数

是否有一个C#等效于boost :: interprocess :: basic_string?

在C++中,使用boost :: interprocess可以定义一个boost :: interprocess :: basic_string,它基本上是一个存储在内存映射文件中的字符串的抽象.您可以像应用程序中的任何其他字符串一样无缝地使用它(当然假设您负责线程安全).

C#是否有任何等效的库/ nuget包/代码片段?

c# c++ shared-memory memory-mapped-files boost-interprocess

5
推荐指数
1
解决办法
442
查看次数

boost interprocess托管共享内存原始指针作为类成员

我想要的是使用名为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)

c++ boost pointers boost-interprocess

5
推荐指数
1
解决办法
1008
查看次数

managed_shared_memory vs windows_shared_memory

我目前正在查看Boost的进程间库的文档,并试图弄清楚它们之间的区别.

从我可以说,唯一的区别是持久性(当最后一个进程退出时释放Windows共享内存,只有在被告知时才释放managed_shm),是否存在其他差异,如速度或我错过了?

c++ boost-interprocess

5
推荐指数
1
解决办法
327
查看次数

对于 IPC 共享对象 -ZeroMQ 或 Boost::interprocess 哪个更快?

我正在考虑自定义对象的进程间共享。我当前的实现使用 ZeroMQ,其中对象被打包成一条消息并从进程 A 发送到进程 B。

我想知道使用 boost::interprocess 实现并发容器是否会更快(其中进程 A 将插入到容器中,进程 B 将从中检索)。不确定这是否比在进程 A 中序列化对象然后在进程 B 中反序列化它更快。

只是想知道是否有人做过基准测试?比较两者在概念上是否正确?

ipc zeromq boost-interprocess c++11

5
推荐指数
2
解决办法
2640
查看次数