MATLAB中的信号量和锁定

Ame*_*ina 13 matlab semaphore race-condition

我正在开发一个MATLAB项目,我希望有两个并行运行的MATLAB实例并共享数据.我会打电话给这些实例MAT_1MAT_2.更具体地说,该系统的架构是:

  1. MAT_1按顺序处理图像,逐个读取它们imread,并使用输出每个图像的结果imwrite.
  2. MAT_2通过MAT_1使用读取输出的图像,imread并将其结果输出到其他地方.

我认为我需要解决的一个问题是保证一次MAT_2读取图像输出完全写入它.MAT_1MAT_1

我的问题是:

  1. 你会如何解决这个问题?我是否需要使用信号量或锁来防止竞争条件?
  2. MATLAB是否提供锁定文件的任何机制?(即类似的东西flock,但由MATLAB直接提供,并且可在多个平台上运行,例如Windows和Linux).如果没有,您是否知道我可以使用任何第三方库在MATLAB中构建此机制?

编辑:

  • 正如@yoda指出的那样,并行计算工具箱(PCT)允许阻止MATLAB工作者之间的调用,这很好.也就是说,我对不需要PCT的解决方案特别感兴趣.
  • 为什么我需要MAT_1MAT_2并行线程中运行?:

    完成的处理MAT_2平均较慢(并且更容易崩溃)MAT_1,并且MAT_1其他程序和进程(包括人工检查)的输出不需要等待MAT_2完成其工作.

答案:

  • 对于允许实现信号量但不依赖于PCT的解决方案,请参阅下面的Jonas的回答
  • 有关此问题的其他好方法,请参阅下面的Yoda答案

And*_*art 7

我会用信号量来接近这个; 根据我的经验,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 semaphore.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
Run Code Online (Sandbox Code Playgroud)


Jon*_*nas 5

就我个人而言,我会为此使用并行处理工具箱。

据我所知,Matlab 中没有直接的方法来获得系统范围的文件锁。然而,为了确保Matlab #2 仅在文件写入完成后读取Matlab #1 的输出,我建议在写入例如文件 后results_1.mat,Matlab #1 写入第二个文件 ,results_1.finished这是一个空文本文件。由于第二个文件是在第一个文件之后写入的,因此它的存在表明结果文件已被写入。因此,您可以搜索扩展名为finishedie的文件dir('*.finished'),并使用它fileparts来获取您想要使用 Matlab #2 加载的 .mat 文件的名称。