matlab mex中C++内存全局共享和持久化

为提高matlab程序运行速度,经常将核心程序编写为mex动态链接库;

然而,经常情况下,在mex函数中分配的内存或句柄希望在mex函数调用完成后在后续函数调用中能够共享而不被释放,本程序方法为解决该问题提供了一种实现方案。

利用mex的C实现方案,为实时应用提供了解决方案。

 

#include <mex.h>
#include <matrix.h>

//全局内存空间
static mxArray *persistent_array_ptr[128] = {NULL};
//初始化标记
static long int initialized[128] = {0};
//计数
static int cnt = 0;

//当清理时的内存释放函数
void cleanup(void) {
    mexPrintf("MEX-file is terminating, destroying %d arraies\n", cnt);
    for(int i = 0; i < cnt; i++)
        if (initialized[i] != -1)
            mxDestroyArray(persistent_array_ptr[i]);
}

//mex入口
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    //最大内存共享总数
    if (cnt >= 128)
    {
        mexPrintf("Error: More than 128 memory blocks.\n");
        return;
    }    
    //判断输入参数是否为0或1个
    //为0:新分配共享内存
    //为1:检索已分配的共享内存
    if (nrhs > 1)
    {
        mexPrintf("UsageA: id = persis_ptr -- alloc new global memory.\n UsageB: persis_ptr id -- get allocated global memory information.\n");
        return;
    }
    //内存分配
    if (nrhs == 0) {
        mexPrintf("initializing, creating new array\n");
        //创建持久化内存空间,这里仅分配一个实数空间
        persistent_array_ptr[cnt] = mxCreateDoubleMatrix(1, 1, mxREAL);
        //以下函数保证了在mex调用完成后,内存空间在全局matlab内不被释放
        mexMakeArrayPersistent(persistent_array_ptr[cnt]);
        //注册内存清理函数
        mexAtExit(cleanup);
        //设置第cnt个内存初始化标记
        initialized[cnt] = 1;
        //赋值
        *mxGetPr(persistent_array_ptr[cnt]) = (cnt + 1)*2;
        cnt++;
        //返回内存块或句柄编号
        nlhs = 1;        
        plhs[0] = mxCreateDoubleScalar(cnt);
    } 
    //检索已分配内存或句柄信息
    else if (nrhs == 1) {
        char *val = mxArrayToString(prhs[0]);
        int id = atoi(val);
        if (id >= 1 && id <= cnt && initialized[id-1] == 1)
        {
            mexPrintf("get Information of No.%d = %f\n", id, *mxGetPr(persistent_array_ptr[id-1]));
        }
        else
            mexPrintf("cannot get information about No.%d memory block(total %d).\n", id, cnt);        
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab Mex共享内存是一种在Matlab程序和C/C++代码之间共享内存数据的方式。Mex文件是一种特殊的二进制文件,可以在Matlab环境调用,同时也可以访问和修改Matlab变量。 Mex共享内存可以在Matlab程序和C/C++代码之间实现高效的数据传输和共享。通过将数据保存在内存,可以避免在Matlab和C/C++之间进行频繁的数据拷贝,从而提高数据传输的效率。 在使用Mex共享内存时,首先需要在C/C++代码显式地声明共享内存标识符,并将其与Matlab变量关联起来。这样,Matlab程序就可以通过这个标识符来访问和修改共享内存的数据。 共享内存可以是临时的,也可以是持久的。临时共享内存Mex函数运行期间有效,当Mex函数结束后,共享内存会被释放。而持久共享内存可以在多次调用Mex函数时保留数据,方便下次使用。 为了确保共享内存的正确使用,需要注意以下几点: 1. 在Mex函数使用共享内存时,需要注意数据的同步和互斥,以避免数据写入冲突。 2. 在使用共享内存时,需要确保数据的正确性和一致性,避免出现意外的数据损坏或丢失。 3. 在使用共享内存时,需要注意内存管理问题,及时释放不再使用的内存,避免内存泄漏。 总而言之,Matlab Mex共享内存可以在Matlab和C/C++代码之间实现高效的数据共享和传输。通过合理的使用共享内存,可以提高程序的性能和效率。但同时也需要注意共享内存的正确使用,避免出现意外的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值