2
我正在瀏覽使用MSMQ共享一個隊列的兩個應用程序的源代碼。第一個應用程序有一個寫入隊列的線程,而第二個應用程序有另一個線程從隊列中讀取。通常,如果你正在實現自己的隊列,訪問隊列時應用程序需要一個互斥鎖,對吧?但是,我無法在這些應用程序的源代碼中找到任何互斥/關鍵部分。我錯過了什麼嗎?或者MSMQ不需要任何互斥體,因爲它在內部處理,有沒有這樣的事情?MSMQ中需要互斥嗎?
我正在瀏覽使用MSMQ共享一個隊列的兩個應用程序的源代碼。第一個應用程序有一個寫入隊列的線程,而第二個應用程序有另一個線程從隊列中讀取。通常,如果你正在實現自己的隊列,訪問隊列時應用程序需要一個互斥鎖,對吧?但是,我無法在這些應用程序的源代碼中找到任何互斥/關鍵部分。我錯過了什麼嗎?或者MSMQ不需要任何互斥體,因爲它在內部處理,有沒有這樣的事情?MSMQ中需要互斥嗎?
的MSMQ文檔指出:
只有以下方法是線程安全的 :BeginPeek,BeginReceive, EndPeek(IAsyncResult的), EndReceive(IAsyncResult的), GetAllMessages,皮克和接收。
MSMQ.Send()是不本質上就是線程安全的。
發送是線程安全的,只要你 總是發送消息的對象,從來沒有 使用直接發送一個.NET對象。使用 消息對象,BTW,始終是一個好主意 - 因爲它允許您添加標籤,超時,可恢復選項 和所有這些使您的MSMQ 解決方案成爲真正的企業解決方案的東西。
class Program { static MessageQueue outQueue; static void Main(string[] args) { outQueue = new MessageQueue(@".\private$\mtQueue"); for (int i = 0; i < 100; i++) { Thread thr = new Thread(new ThreadStart(MyThreadProc)); thr.Start(); } } static void MyThreadProc() { Message msg = new Message(); for (int i = 0; i < 100; i++) { msg.Label = string.Format("{0} : {1}", Thread.CurrentThread.ManagedThreadId, i); outQueue.Send(msg); } } }
我不知道如果我明白你的最後一句話。在每個線程上創建一個單獨的隊列實例,並讓MSMQ處理來自不同線程的消息 - 我需要使用互斥鎖嗎? – jasonline 2010-02-24 03:29:29
是的,如果我在每個線程上創建一個單獨的MSMQ對象實例,那麼我不需要使用一個互斥對嗎? – jasonline 2010-02-24 03:37:30
其實,更多的挖掘後請看我更新的答案... – 2010-02-24 03:38:45