2014-01-07 269 views
0

我的一些朋友编写了一个程序,它使用C程序从网络(UDP)接收数据并使用Matlab来处理收到的数据。两个文件即'数据文件'和'控制文件'用于在Matlab和C之间进行数据通信。方案如下。在Matlab和C之间共享数据

  1. C程序从网络接收数据,如果'控制文件'包含'0',则将接收到的数据写入'数据文件'中。完全写入数据后,'控制文件'中的'0'被替换为'1'。
  2. Matlab程序连续在'控制文件'中检查'1',并在'控制文件'中读取'1'后立即从'数据文件'中读取数据。在读取和处理数据后,Matlab在'控制文件'中用'0'代替'1'。

基本上,该方案试图使用'控制文件'作为'锁'来安全地处理'数据文件'中的数据。数据每1毫秒连续收到,处理需要软实时。

虽然声称一切都很完美,但我觉得这里有点可疑。原则上,我们应该使用类似于信号量的东西来正确锁定资源....对吧? 这个方案有什么缺陷?有没有更好的替代方案?

编辑:现在我看到有人建议在Launch one C++ application from another, and communicate with it

我想确切地知道为什么这是一个“脏”技术类似的“快速和肮脏的”技术?它会在所有情况下都成功吗?

+0

如果在打开文件时锁定文件,那么被锁定的文件在性质上与关键区域类似。问题是,这两个应用程序,C和Matlab,是否都使用打开的文件来锁定文件。如果两者都是,那么如果一个文件打开并且被锁定,那么当另一个尝试打开该文件时,该打开将被拒绝。 –

+2

为什么你不直接在MATLAB中执行socket IO? – glglgl

+0

我建议你抛弃整个基于文件的方案。请使用[TCP/UDP/IP工具箱](http://www.mathworks.com/matlabcentral/fileexchange/345-tcpudpip-toolbox-2-0-6)或将C程序移植到MEX文件 – Peter

回答

2

您必须使用文件锁定你的情况(read wiki

您可能也有兴趣看到MEX-文件提供Matlab和C间的界面,因此它将使从MATLAB调用C函数。请参阅herehere

+0

谢谢你的回答。正如您正确指出的那样,应该使用文件锁定或一些类似的机制来避免竞争状态和死锁。使用上面解释的方案开发的应用程序在很多天内工作正常。数据速率也很高(每5毫秒间隔8K个数据包)。我想知道它是如何可能的,因为该方案不使用任何高级规则,如文件锁定或互斥/信号量! – Sooraj