用boost共享内存实现进程通信的例子

发送端

#include "DBProc1.h"
#include <string>
#include <thread>
#include <boost/thread/thread.hpp>
using namespace boost::interprocess;
PLUG_COMPONENT_AUTO_REG(DBProc1)//DO NOT EDIT THIS
struct MyStruct
{
    int a;
    int b;
    std::string s;
    int v[3];
};
//------------------------------------------------------------------------------------------------------------------

DBProc1::DBProc1()
{
}

DBProc1::~DBProc1()
{
}

bool DBProc1::test()
{
    shared_memory_object mu(open_or_create, "mutex", read_write);
    mu.truncate(sizeof(镜像));
    mapped_region mru(mu, read_write);
    void* addrmu = mru.get_address();
    m_镜像 = new(addrmu)镜像;

    shared_memory_object smo(open_or_create, "gongxiang", read_write);
    smo.truncate(10 * 1024);
    mapped_region mr(smo, read_write);
    void* addr = mr.get_address();
    MyStruct* my = new(addr)(MyStruct);
    int i = 100;
    std::thread th([&]()
    {
        while (true)
        {
            {
                scoped_lock<interprocess_mutex> lock(m_镜像->mutex);
                my->a = 1;
                my->b = 2;
                char buf[20];
                itoa(i++, buf, 10);
                my->s = buf;
                my->v[0] = 90;
                my->v[1] = 80;
                my->v[2] = 70;
            }
            boost::this_thread::interruptible_wait(1000);//这个需要放在外面,放在里面虽然当前放弃了时间片,但当前进程还是拥有锁,别的进程还是不能执行,所以需要放在外面
        }

    });
    getchar();
    return true;
}
//------------------------------------------------------------------------------------------------------------------

接收端

#include "DBProc2.h"
#include <string>
#include <thread>
#include <boost/thread/thread.hpp>
PLUG_COMPONENT_AUTO_REG(DBProc2)//DO NOT EDIT THIS
struct MyStruct
{
    int a;
    int b;
    std::string s;
    int v[3];
};
//------------------------------------------------------------------------------------------------------------------

DBProc2::DBProc2()
{
}

DBProc2::~DBProc2()
{
}

bool DBProc2::test()
{
    shared_memory_object shm(open_only ,"mutex" ,read_write);
    mapped_region mu(shm ,read_write);
    void * addrmu       = mu.get_address();
    m_镜像 = static_cast<镜像*>(addrmu);

    shared_memory_object sho(open_only ,"gongxiang" ,read_write);
    mapped_region mr(sho ,read_write);
    void * addr = mr.get_address();

    std::thread th([=]()
    {
        while (1)
        {
            {
                scoped_lock<interprocess_mutex> lock(m_镜像->mutex);
                MyStruct* mu = static_cast<MyStruct*>(addr);
                std::cout << mu->s << std::endl;
            }
            boost::this_thread::interruptible_wait(1000);//同理这个也需要放在外面
        }

    });
    getchar();
    return true;
}
//------------------------------------------------------------------------------------------------------------------

用boost共享内存实现进程通信的例子

时间: 2024-12-13 12:43:54

用boost共享内存实现进程通信的例子的相关文章

80.共享内存实现进程通信

服务器创建共享内存 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<Windows.h> 4 5 #define SIZE 4096 6 //指针标识首地址 7 LPVOID lpdata = NULL; 8 9 10 void main() 11 { 12 if (lpdata!=NULL) 13 { 14 puts("共享内存存在"); 15 } 16 //创建共享内存 17 HANDLE

一个基于共享内存的ipc通信框架

一个基于共享内存的ipc通信框架 与共享内存相关的操作主要包括共享内存的初始化, 共享内存的释放, 共享内存的锁的相关操作, 在这里操作共享内存的环境是: 1 多个进程没有亲缘关系, 也没有server/client关系, 是多个不相关进程并发操作共享内存 2 共享内存一开始不存在, 由第一个访问他的进程创建 3 当共享内存退出时, 由最后一个离开的进程释放共享内存, 并清除信号量 在这个问题之中, 主要有两个比较大的问题: 1 怎样新建并初始化共享内存 新建共享内存的数据都可以用信号量来控制,

ACE框架 基于共享内存的进程间通讯

ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter.ACE框架为基于共享内存的进程间通讯提供了两种数据传输(分发deliver)策略.一种是使用生产者-消费者队列的一对多的多用户MT策略,另一种是使用socket流的可以使用反应器响应数据接收事件的Reactor策略.不论哪一种策略都要通过socket进行TCP连接,并进行进程

Windows进程通信-共享内存空间

三个模块 1,game.exe,三个方法,控制台输入指令('A','B','R')分别控制三个方法的调用: 2,WGDll.dll,要注入到game进程中的dll文件: 3,myconsole.exe,用来注入dll文件的程序: 先开启game进程,然后用myconsole把dll注入到game,dll模块和myconsole模块利用共享内存实现进程通信,在myconsole的控制台输入指令,dllmokuai接受指令,调用game模块的方法,达到控制game的目的 game模块 #includ

Java进程通信之映像文件共享内存

Java进程通信之映像文件共享内存 1. 共享内存 vs 进程通信 对UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种.但windows实际上只有影像文件共享内存一种. 而说到进程通信,First当然是Socket通信,但缺点太明显.其一,浪费网络资源,其二,多余的code成本也绝非所愿. 综上,映像文件共享内存方式,成为了实际应用中推荐使用的进程通信手段. 2.优点 数据共享/动态配置/减少资源浪费 3.特点 可被多个进程打开访问 读写操作的进程在执行读写操作时,其他进程不能进

Linux进程间通信 共享内存+信号量+简单例子

每一个进程都有着自己独立的地址空间,比如程序之前申请了一块内存,当调用fork函数之后,父进程和子进程所使用的是不同的内存.因此进程间的通信,不像线程间通信那么简单.但是共享内存编程接口可以让一个进程使用一个公共的内存区段,这样我们便能轻易的实现进程间的通信了(当然对于此内存区段的访问还是要控制好的). 共享内存实现进程通信的优点: 共享内存是进程通信方式中最快速的方式之一,它的快速体现在,为数据共享而进行的复制非常少.这里举例来说,使用消息队列时,一个进程向消息队列写入消息时,这里有一次数据的

Linux进程间通信 共享内存+信号量+简单样例

每个进程都有着自己独立的地址空间,比方程序之前申请了一块内存.当调用fork函数之后.父进程和子进程所使用的是不同的内存. 因此进程间的通信,不像线程间通信那么简单.可是共享内存编程接口能够让一个进程使用一个公共的内存区段,这样我们便能轻易的实现进程间的通信了(当然对于此内存区段的訪问还是要控制好的). 共享内存实现进程通信的长处: 共享内存是进程通信方式中最高速的方式之中的一个,它的高速体如今,为数据共享而进行的复制很少.这里举例来说.使用消息队列时.一个进程向消息队列写入消息时.这里有一次数

UnixIPC之共享内存

Unix-IPC之共享内存 一,共享内存的概念 共享内存通信技术是一种最快的可用IPC形式,它是针对其他通信机制运行效率低和设计的新型通信技术(其他的如:信号量,管道,套接字等).这种通信技术往往与其他通信机制(如信号量)结合使用,用于达到进程间的同步及互斥. 原理: 这种方式是在所有进程的独立空间之外开辟一块内存空间,它不属于任何一个进程,当所有进程都可以访问.利用这样的共享特性,发送进程就可以往共享区域中写入数据,而接收进程则可以从共享区域中获取所需信息. 采用共享内存的进程通信的特点: 进

撸代码--linux进程通信(基于共享内存)

1.实现亲缘关系进程的通信,父写子读 思路分析:1)首先我们须要创建一个共享内存. 2)父子进程的创建要用到fork函数.fork函数创建后,两个进程分别独立的执行. 3)父进程完毕写的内容.同一时候要保证子进程退出后,在删除共享内存. 4)子进程完毕读的内容. 效果展示:                 代码展示:           #include <string.h> #include <unistd.h> #include <sys/types.h> #inc