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

本文探讨了并发编程中使用多线程进行资源共享与操作的复杂性,通过实例展示了如何实现线程间的互斥访问,以及在多线程环境下对共享资源的正确管理。重点介绍了内存对象的创建、初始化、共享和同步机制的运用,旨在提高并发程序的效率和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发送端

#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;
}
//------------------------------------------------------------------------------------------------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值