什么是更快,锁定或Thread.Interrupt?

时间:2011-06-09 14:17:34

标签: c# multithreading networking

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

Thread.Interruptlock都不适合用于发信号通知其他线程。

  • Thread.Interrupt用于戳戳或取消BCL中的一个阻止调用。
  • lock用于防止同时访问资源或代码块。

使用以下机制之一可以更好地完成其他线程的信号传递。

答案 2 :(得分:0)

我通常在读取或写入时使用标准队列和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中的新并行化功能对您的应用程序也可能非常有用(如果这是一个选项)。