现在的位置: 首页 > 综合 > 正文

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

2013年06月23日 ⁄ 综合 ⁄ 共 1480字 ⁄ 字号 评论关闭

为提高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);        
    }
}

抱歉!评论已关闭.