zoukankan      html  css  js  c++  java
  • 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
    ", 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.
    ");
            return;
        }    
        //判断输入参数是否为0或1个
        //为0:新分配共享内存
        //为1:检索已分配的共享内存
        if (nrhs > 1)
        {
            mexPrintf("UsageA: id = persis_ptr -- alloc new global memory.
     UsageB: persis_ptr id -- get allocated global memory information.
    ");
            return;
        }
        //内存分配
        if (nrhs == 0) {
            mexPrintf("initializing, creating new array
    ");
            //创建持久化内存空间,这里仅分配一个实数空间
            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
    ", id, *mxGetPr(persistent_array_ptr[id-1]));
            }
            else
                mexPrintf("cannot get information about No.%d memory block(total %d).
    ", id, cnt);        
        }
    }
    


  • 相关阅读:
    免费音频录制及处理软件 Audacity
    centos7设置程序开机启动方案
    tomcat开启前或者关闭前执行清理任务 servlet基础知识解决
    BigDecimal比较大小及判0处理
    File文件夹操作创建层级文件夹
    centos7设置activemq开机启动
    tomcat关闭时无法清理资源解决方案
    java数据类型和C++的对应关系 SDK开发
    centos7查询开机启动项及设置服务为开机自启动
    Entity Framework 教程
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3239137.html
Copyright © 2011-2022 走看看