我有一个程序,涉及在一个线程上从网络接收数据包,然后通知其他线程收到该数据包。我当前的方法使用Thread.Interrupt,这在传输大量数据时似乎有点慢。使用“lock”来避免使用多个中断,或者锁实际上只是在其实现中调用Interrupt()会更快吗?
答案 0 :(得分:2)
我不明白为什么你会使用Thread.Interrupt
而不是一些更传统的信令方法来通知等待线程收到数据。 Thread.Interrupt
要求目标线程无论如何都处于等待状态,那么为什么不添加一个可以向目标线程的等待逻辑发出信号的对象,并使用它来获取新数据呢?
lock
用于保护关键代码或数据不被其他线程执行,并且不适合作为线程间活动信令的机制。
在合适的对象上使用WaitOne
或WaitAll
而不是其中任何一个。 .Net 4中的System.Collections.Concurrent
还提供了将新数据排队到目标线程策略的绝佳方法,以及解决问题的其他可能方法。
答案 1 :(得分:1)
Thread.Interrupt
和lock
都不适合用于发信号通知其他线程。
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中的新并行化功能对您的应用程序也可能非常有用(如果这是一个选项)。