【问题标题】:Mutex needed in MSMQ?MSMQ 中需要互斥体?
【发布时间】:2011-01-20 08:54:11
【问题描述】:

我正在使用 MSMQ 浏览共享一个队列的两个应用程序的源代码。第一个应用程序有一个写入队列的线程,而第二个应用程序有另一个从队列读取的线程。通常,如果您要实现自己的队列,则应用程序在访问队列时需要互斥体,对吗?但是,我在这些应用程序的源代码中找不到任何互斥/关键部分。我是不是错过了什么?或者MSMQ不需要任何互斥体,因为它是内部处理的,有这样的事情吗?

【问题讨论】:

    标签: multithreading msmq mutex visual-c++-6


    【解决方案1】:

    MSMQ 文档指出:

    只有以下方法是线程 安全:BeginPeek、BeginReceive、 EndPeek(IAsyncResult), 结束接收(IAsyncResult), GetAllMessages、Peek 和 Receive。

    MSMQ.Send() 不是本质上是线程安全的。

    发送是线程安全的,只要你 总是发送一个 Message 对象,从不 使用直接发送一个 .NET 对象。使用 消息对象,顺便说一句,始终是 好主意 - 因为它可以让你添加 标签,超时,可恢复选项 和所有这些让你的 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);
            }
        }
    }
    

    发件人:Is Send() thread safe?

    【讨论】:

    • 我不确定我是否理解您的最后陈述。在每个线程上创建一个单独的队列实例,让 MSMQ 处理来自不同线程的消息 - 我需要为此使用互斥锁吗?
    • 是的,如果我在每个线程上创建一个单独的 MSMQ 对象实例,那么我就不需要使用互斥锁了吧?
    • 我怎么看不到你的答案“在每个线程上创建一个单独的队列实例,让 MSMQ 处理来自不同线程的消息”。这实际上是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2010-09-12
    • 2023-03-20
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多