【问题标题】:Message queue vs thread lock [closed]消息队列与线程锁[关闭]
【发布时间】:2013-12-15 19:48:15
【问题描述】:

我有一个基于 .net 技术的 Windows 应用程序。在我的应用程序中,我收到了来自不同线程的大量消息。一旦我收到一条消息,我需要调用一个应该是线程安全的函数。 我用过

lock (lockThis)
        {
            TSFunction(message);
        }

现在有人建议我改用消息队列。我完全不熟悉这种方法,但我想选择更好的方法。 我应该切换到消息队列吗?如果是,那么有人可以指点我一些好的教程吗?

【问题讨论】:

  • lock 中调用函数不会使函数线程安全。消息队列也不能使任何东西本质上是线程安全的。唯一可以可靠地使线程安全的是方法的 content,而不是您调用它的方式。无论哪种方式,询问 StackOverflow 是否应该切换都代表我们对您的系统有太多了解(我们不知道您的更广泛的要求是什么!),并且在许多情况下也是一个相当主观的问题。

标签: c# multithreading thread-safety message-queue


【解决方案1】:

在您当前的设计中,每当您处理消息时,其他线程都会被完全阻塞。如果这不是问题,那谁在乎,对吧?

如果这让您感到困扰(例如,您想提高响应能力),那么是的,消息队列将是一个好主意。您需要承担锁,将消息放入队列中,然后释放锁(或找到为您执行此操作的线程安全集合)。然后您稍后处理该消息。这样,消息发送线程将被阻塞的时间可以忽略不计。

但请注意:消息处理将不同步。因此,例如,如果消息处理速度很慢,则线程可能会在处理多条消息之前发送它们。是否允许这样做由您决定。这实际上使您的应用程序的线程安全性降低,但它可以更好地执行(更少的等待时间)。

您甚至可以在线程池中进行消息处理,并行处理多条消息等。选项无穷无尽。

【讨论】:

  • 取决于其他线程中的锁定模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2011-10-01
  • 2011-03-13
  • 2011-03-25
  • 2017-06-10
  • 1970-01-01
  • 2018-06-30
相关资源
最近更新 更多