2011-02-28 116 views
1

我使用C#(MS visual studio 2010)來模擬生產者 - 消費者問題。我有2個exe程序,一個是Producer,另一個是Consumer。當他們執行時,Producer會將100個整數插入隊列中,而Consumer將按順序將它們從該隊列中移除。如何在C#中的兩個進程之間使用共享隊列?

我的問題是如何在兩個進程之間使用共享隊列,並且萬一我必須使用進程間通信傳遞一些小消息,我應該使用哪種機制(在剪貼板,COM,數據複製,DDE,文件映射,郵槽,管道,RPC,Windows套接字)?

非常感謝!

回答

0

我只是簡單地使用消息排隊技術,如MSMQ。看看這是否適合您的要求。您可以將其與NServiceBus一起使用,它可以爲您提供現成的全部酒吧/分模式,並且相對易於使用。

0

另一個選擇,我會想到在同時使用多個讀/寫之間的表上使用具有併發控制的數據庫事務表。

0

如果兩個進程在同一進程內轉換爲線程,那麼它們會更容易,因此它們可以直接共享內存。除了這個,你可以使用內存映射I/O在進程和一個已命名的互斥體之間建立一個共享內存區域,以確保只有一個線程在一段時間內訪問它。您必須將自己的隊列寫入原始指針,這很容易出錯。

即使在這種情況下,隊列也可能無法鎖定,但這很難完成,可能不值得。

+0

謝謝。我正在學習IPC,因此不需要多線程程序。我有一個新問題,我想使用一個文件作爲緩衝區,生產者程序將數據寫入它,而消費者程序從它讀取數據。由於緩衝區總是有大小限制,所以每次從中讀取數據時都必須刪除一行。谷歌說,要從文件中刪除一行,我必須將其重寫爲一個臨時文件,然後覆蓋現有文件。有沒有更好的方法從文件中刪除第一行? – Mia 2011-03-01 06:15:09

+0

是的,將其視爲循環緩衝區。換句話說,跟蹤開始和結束(最初,都指向前面)。當你添加時,推回去。閱讀時,向前推前方。在緩衝區的末尾,只是換行。有關詳細信息和鏈接,請參見http://en.wikipedia.org/wiki/Circular_buffer。 – 2011-03-02 15:53:14

相關問題