我正在开发一个 MATLAB 项目,希望有两个 MATLAB 实例并行运行并共享数据。我将调用这些实例MAT_1
and MAT_2
。更具体地说,该系统的架构是:
-
MAT_1
按顺序处理图像,使用以下命令一一读取它们imread
,并使用输出每个图像的结果imwrite
.
-
MAT_2
读取图像输出MAT_1
using imread
并将其结果输出到其他地方。
我认为我需要解决的问题之一是保证MAT_2
读取图像输出MAT_1
once MAT_1
已完全完成对它的写入。
我的问题是:
- 您将如何解决这个问题?我是否需要使用信号量或锁来防止竞争条件?
- MATLAB 是否提供任何锁定文件的机制? (即类似于flock,但由 MATLAB 直接提供,并且可以在多个平台上运行,例如Windows 和 Linux)。如果没有,您知道我可以使用任何第三方库在 MATLAB 中构建此机制吗?
EDIT :
答案:
- 对于允许实现信号量但不依赖 PCT 的解决方案,请参阅下面乔纳斯的回答
- 有关解决该问题的其他好方法,请参阅下面尤达的回答
我会使用信号量来解决这个问题;根据我的经验,PCT 的同步速度慢得不合理。
dfacto(另一个答案)有一个很好的 MATLAB 信号量实现,但它不适用于 MS Windows;我改进了那项工作,这样它就可以了。改进后的工作在这里:http://www.mathworks.com/matlabcentral/fileexchange/45504-semaphoreposixandwindows
这比与 Java、.NET、PCT 或文件锁交互的性能更好。这不使用并行计算工具箱(PCT),并且 AFAIK 信号量功能无论如何也不在 PCT 中(令人费解的是他们遗漏了它!)。可以使用 PCT 进行同步,但我尝试过的所有操作都慢得不合理。
要将此高性能信号量库安装到 MATLAB 中,请在 MATLAB 解释器中运行以下命令:
mex -O -v 信号量.c
您需要安装 C++ 编译器才能将 semaphore.c 编译为二进制 MEX 文件。然后可以从 MATLAB 代码调用该 MEX 文件,如下例所示。
使用示例:
function Example()
semkey=1234;
semaphore('create',semkey,1);
funList = {@fun,@fun,@fun};
parfor i=1:length(funList)
funList{i}(semkey);
end
end
function fun(semkey)
semaphore('wait',semkey)
disp('hey');
semaphore('post',semkey)
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)