相关疑难解决方法(0)

MATLAB parfor和C++类mex包装器(需要复制构造函数吗?)

我正在尝试使用此处概述的方法将C++类包装在matlab mex包装器中.基本上,我有一个初始化mex文件,它返回一个C++对象句柄:

handle = myclass_init()
Run Code Online (Sandbox Code Playgroud)

然后我可以将它传递给另一个myclass_amethod使用句柄调用类方法的mex文件(例如),然后最终myclass_delete释放C++对象:

retval = myclass_amethod(handle, parameter)
myclass_delete(handle)
Run Code Online (Sandbox Code Playgroud)

为了便于使用,我把它包装在一个MATLAB类中:

classdef myclass < handle
    properties(SetAccess=protected)
        cpp_handle_
    end
    methods
        % class constructor
        function obj = myclass()
            obj.cpp_handle_ = myclass_init();
        end
        % class destructor
        function delete(obj)
            myclass_delete(obj.cpp_handle_);
        end
        % class method
        function amethod(parameter)
            myclass_amethod(obj.cpp_handle_, parameter);
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

问题:这在并行代码中不起作用

这在非并行代码中工作正常.但是,只要我从一个内部调用它parfor:

cls = myclass();
parfor i = 1:10
    cls.amethod(i)
end
Run Code Online (Sandbox Code Playgroud)

我得到一个段错误,因为类的副本是在parfor循环中(在每个worker中)制作的,但由于每个worker都是一个单独的进程,因此不会复制C++对象实例,从而导致指针无效.

我最初尝试检测每个类方法何时在parfor循环中运行,并且在这些情况下也重新分配C++对象.但是,由于无法检查是否已为当前工作程序分配了对象,因此会导致多次重新分配,然后只有一次删除(当工作人员退出时)导致内存泄漏(请参阅附录中的附录)问题详情).

尝试解决方案:复制构造函数并使用 matlab.mixin.Copyable

在C++中,处理它的方法是复制构造函数(这样只有在复制包装器MATLAB类时才重新分配C++对象).快速搜索会显示matlab.mixin.Copyable类类型,它似乎提供了所需的功能(即MATLAB句柄类的深层副本).因此,我尝试了以下方法:

classdef myclass …
Run Code Online (Sandbox Code Playgroud)

oop parallel-processing matlab mex copy-constructor

8
推荐指数
1
解决办法
1885
查看次数

标签 统计

copy-constructor ×1

matlab ×1

mex ×1

oop ×1

parallel-processing ×1