共享記憶體大資料量快速程序間通訊
阿新 • • 發佈:2019-02-15
最近在做一個程序間頻繁,資料量比較大的通訊
採用的是共享記憶體通訊,和生產者消費者模式。除錯了幾天,記錄一些要點
結構如下圖
注意:
1、因為是共享,如果程序B有多個物件要寫資料到共享記憶體,每次寫入計數和使用緩衝佇列索引的時候都要使用全域性的,如果不方便全域性那也用共享內存來儲存這兩關鍵計數。
2、程序B在迴圈寫入資料的時候加鎖。
3、程序A讀取緩衝佇列裡最新的資料,是通過讀寫入計數前後兩次差值來確定的,如果超過了緩衝佇列長度,那麼就取最新的資料,同時在讀完所有資料再釋放鎖,如果沒有超過緩衝佇列長度,那麼直接釋放鎖就可以了,畢竟緩衝佇列還可以再寫入。
4、B程序寫入計數應該避免溢位,最好大於一定的數就重新計,但這需要程序A依然可以計算出最新的資料數量
5、程序A在讀取資料的時候,如果沒有資料可能會一直讀取,不要忘記sleep幾毫秒,這幾毫秒就是通訊的最大時間,速度槓槓的。
6、用Google.Protobuf來打包和解包資料特別方便,再附上生成通訊程式碼的批處理
cd /d %~dp0
@echo off
for %%i in (*.proto) do protoc.exe -I=.\ --cpp_out=..\B\Proto %%i
for %%i in (*.proto) do protoc.exe -I=.\ --csharp_out=..\A\A.Proto %%i
for %%i in (*.xlsx) do .\GenerateDccConfig.exe %cd%\%%i