zoukankan      html  css  js  c++  java
  • 用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;
    }
    //------------------------------------------------------------------------------------------------------------------
  • 相关阅读:
    schedule和scheduleAtFixedRate的区别
    JAVAWEB项目报"xxx响应头缺失“漏洞处理方案
    springboot整合swagger初探指南
    wsl安装jdk
    树莓派开机启动chrome并全屏
    数据库06_数据库设计
    数据库05_事务处理
    数据库04_SQL简单实践
    Spring-AOP
    数据库03_SQL语句
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3902769.html
Copyright © 2011-2022 走看看