MSMQ 中需要互斥吗?

发布于 2024-08-22 16:26:36 字数 188 浏览 9 评论 0原文

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

I'm browsing source codes from two applications sharing one queue using MSMQ. The first application has a thread that writes into the queue while the second application has another thread that reads from the queue. Ordinarily, if you're implementing your own queue, the applications would need a mutex when accessing the queue, right? However, I could not find any mutex/critical section in the source codes of these applications. Did I just miss something? Or does MSMQ not need any mutex since it is handled internally, is there such thing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

2024-08-29 16:26:36

MSMQ 文档指出:

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

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

发送是线程安全的,只要你
总是发送 Message 对象并且从不
使用直接发送 .NET 对象。使用
顺便说一句,消息对象始终是
好主意 - 因为它可以让你添加
标签、超时、可恢复选项
以及所有这些使您的 MSMQ
解决方案是真正的企业解决方案。

类程序
{
    静态消息队列输出队列;
    静态无效主(字符串[]参数)
    {
        outQueue = new MessageQueue(@".\private$\mtQueue"); 

        for (int i = 0; i < 100; i++)
        {
            线程 thr = new Thread(new ThreadStart(MyThreadProc));

            thr.Start();
        }
    } 

    静态无效 MyThreadProc()
    {
        消息 msg = new Message();
        for (int i = 0; i < 100; i++)
        {
            msg.Label = string.Format("{0} : {1}",
                                     线程.CurrentThread.ManagedThreadId,
                                      我);
            outQueue.Send(消息);
        }
    }
}

来自: Send() 线程安全吗?

The MSMQ documentation states that:

Only the following methods are thread
safe: BeginPeek, BeginReceive,
EndPeek(IAsyncResult),
EndReceive(IAsyncResult),
GetAllMessages, Peek, and Receive.

MSMQ.Send() is not inherently thread-safe.

Send is thread safe, as long as you
always send a Message object and never
use send a .NET object directly. Using
the Message object, BTW, is always a
good idea - since it lets you add
label, timeouts, recoverable option
and all this stuff that make your MSMQ
solution a real enterprise solution.

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);
        }
    }
}

From: Is Send() thread safe?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文