【问题标题】:What is faster, lock or Thread.Interrupt?什么更快,锁或 Thread.Interrupt?
【发布时间】:2011-06-09 14:17:34
【问题描述】:

我有一个程序涉及在一个线程上从网络接收数据包,然后通知其他线程该数据包已收到。我目前的方法使用 Thread.Interrupt,在传输大量数据时似乎有点慢。使用“锁”来避免使用多个中断会更快,还是锁真的只是在其实现中调用 Interrupt()?

【问题讨论】:

  • 有很多地方可以找到反对在应用程序中对“正常”控制流使用异常的建议。在我看来,首先将Thread.Interrupt 排除在外。
  • 这个问题;是否在“锁”内部引发异常,从而使两者等效?
  • 锁和Thread.Interrupt似乎都不是实现线程间通信或同步的明智方式。我什至不确定您会如何考虑在这种情况下使用锁。但我相当肯定我可以回答提出的最后一个问题 - 我不相信 lock 在内部使用 Thread.Interrupt

标签: c# multithreading networking


【解决方案1】:

我不明白你为什么要使用Thread.Interrupt 而不是一些更传统的信令方法来通知等待线程接收到数据。 Thread.Interrupt 无论如何都要求目标线程处于等待状态,那么为什么不添加一个可以向目标线程的等待逻辑发出信号的对象,并使用它来获取新数据呢?

lock 用于保护关键代码或数据不被其他线程执行,不适合作为线程间活动信号的机制。

在合适的对象上使用WaitOneWaitAll 而不是其中任何一个。 .Net 4 中的 System.Collections.Concurrent 还提供了将新数据排队到目标线程 pol 的出色方法,以及解决问题的其他可能方法。

【讨论】:

  • 我一定是在你的设计中遗漏了一些东西。如果目标线程准备好处理新数据,它们可以等待某个对象并立即获得通知(这不是状态变量轮询,您似乎认为?)。如果您的目标线程未处于处理新数据的正确状态,那么“丢弃所有内容,这里是新数据”信令方法的价值是什么?
  • 查看了 WaitHandle 的文档,看起来它应该工作得很好。
  • 史蒂夫和布赖恩不建议你投票。等待函数是阻塞的,如果发出适当的信号,将“立即”返回。此外,如果需要将数据包发送给线程,则将数据包接收到分配的结构/类实例中并仅传输指针/引用是“传统的”。无论涉及多少数据,“传输”都会花费相同的时间。
  • @IDWMaster - WaitHandle 通常是@Brian Gideon 列出的同步对象的超类 - 从该列表中挑选你的毒药,祝你好运。
【解决方案2】:

Thread.Interruptlock 都不太适合向其他线程发送信号。

  • Thread.Interrupt 用于戳或解开 BCL 中的阻塞调用之一。
  • lock 用于防止同时访问资源或代码块。

通过以下机制之一更好地向其他线程发送信号。

【讨论】:

    【解决方案3】:

    我通常在读取或写入时使用标准队列和 lock 关键字。或者,队列上的 Synchronized 方法消除了使用锁的需要。 System.Threading.Semaphore 是在有新作业要处理时通知工作线程的最佳工具。

    如何添加到队列的示例

    lock ( myQueue) { myQueue.Enqueue(workItem); }
    mySemaphore.Release();
    

    如何处理工作项的示例:

    mySemaphore.WaitOne();
    lock (myQueue) { object workItem = myQueue.Dequeue(); }
    // process work item
    

    信号量设置:

    mySemaphore = new Semaphore(0, int.MaxValue);
    

    如果这太慢并且同步开销仍然在您的应用程序中占主导地位,您可能需要考虑一次调度多个工作项。

    根据您正在做的事情,.NET 4.0 中的新并行化功能也可能对您的应用程序非常有帮助(如果可以的话)。

    【讨论】:

    • 正如其他人所提到的,Thread.Interrupt 是奇怪且不标准的。实际上,直到现在我才听说过它,而且我已经在 .NET 中进行了多年的多线程处理。如果您要使用易于维护且易于理解的代码,那么上面的示例就不会简单得多。
    • 是的。这正是我几十年来一直在进行线程间通信的方式。我用过的每个操作系统都可以使用某种形式的“lock()”、“semaphore.signal”和“semaphore.wait”。只要你再低一点,看看无锁队列、互锁交换、condvars 等,事情就开始变得依赖于平台/CPU/OS :(
    猜你喜欢
    • 2014-06-19
    • 2012-11-09
    • 1970-01-01
    • 2020-02-21
    • 2010-12-20
    • 2022-01-18
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多