什么更快,锁定还是线程中断
本文关键字:线程 中断 锁定 什么 | 更新日期: 2023-09-27 17:58:42
我有一个程序,它涉及在一个线程上从网络接收数据包,然后通知其他线程该数据包已收到。我目前的方法使用Thread.Interrupt,当传输大量数据时,它似乎有点慢。使用"lock"来避免使用过多的中断会更快吗?还是锁在实现中真的只是调用Interrupt()?
我不明白为什么要使用Thread.Interrupt
而不是一些更传统的信令方法来通知等待的线程数据已收到。Thread.Interrupt
无论如何都要求目标线程处于等待状态,那么为什么不添加一个可以向目标线程的等待逻辑发出信号的对象,并用它来获取新数据呢?
lock
用于保护关键代码或数据不被其他线程执行,并且不适合作为线程间活动信令的机制。
在合适的对象上使用WaitOne
或WaitAll
,而不是其中之一。.Net 4中的System.Collections.Concurrent
还提供了将新数据排队到一组目标线程的极好方法,以及解决问题的其他可能方法。
Thread.Interrupt
和lock
都不太适合用信号通知其他线程。
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中的新并行化功能可能对您的应用程序也很有帮助(如果可以的话)。