2014-01-07 228 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