2011-03-12 65 views
0

我想要實現在Unix的具有共享存儲器的一生產者,多消費者模型中的多個消費者模型
製片:把數據幀(〜炭[1024])中內存段
消費者:數據memcpy(複製)到自己的私有內存,並做一些處理同步在一個生產者+具有共享存儲器

一些相關信息:

  1. 這是正常的消費者錯過一些d ata框架
  2. 消費者是獨立的,例如。這沒關係,如果一個消費者只得到數據1,2,4,而另一個得到2,3,5
  3. 關於10消費者會在同一時間運行
  4. 生產者可以快於消費者可處理生成的數據
  5. 慢速/殭屍消費者不應拖慢整個系統
  6. 消費者將跳過的memcpy如果看到同樣的數據

我已經設置了共享內存的東西,並使用並行線程讀寫鎖,但它似乎比使用TCP模式要慢

我的問題:哪種同步最適合這種模式?

+0

你是指「錯過某個數據框?」一個消費者獲得1,2,4和另一個消費者獲得2,3,5的確切程度如何?你不介意2次被處理兩次嗎? – aib 2011-03-12 22:56:28

+0

我不認爲這是同步問題。 (好吧,但解決方案很少,很簡單。)這裏面臨的更大問題是調度。 – aib 2011-03-12 22:57:34

+0

我不確定您是否可以使用.NET庫,但是您需要類似[ReaderWriterLockSlim](http://msdn.microsoft.com/zh-cn/library/system.threading.readerwriterlockslim.aspx) 和[相關問題](http://stackoverflow.com/questions/5188475/is-readerwriterlockslim-the-right-coice/5188627#5188627) – 2011-03-12 23:02:40

回答

0

你確定問題出在同步模型嗎?

我在考慮別的東西:也許生產者「保持令牌」太長。例如,生產者應該在私有內存中生成1024個字節,並保存共享內存以記錄新數據?

確保關鍵部分儘可能小。