什么更快,锁定还是线程中断

本文关键字:线程 中断 锁定 什么 | 更新日期: 2023-09-27 17:58:42

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

什么更快,锁定还是线程中断

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

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

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

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

  • Thread.Interrupt用于插入或取消插入BCL中的一个阻塞调用
  • CCD_ 10用于防止同时访问资源或代码块

使用以下机制之一可以更好地向其他线程发送信号。

  • ManualResetEvent(或ManualResetAventSlim)
  • 自动重置事件
  • 事件等待句柄
  • 屏障
  • 倒计时事件
  • WaitHandle.WaitAny或WaitHandle.WaitAll

在读取或写入时,我通常使用标准队列和lock关键字。或者,队列上的Synchronized方法可以消除使用lock的需要。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中的新并行化功能可能对您的应用程序也很有帮助(如果可以的话)。