C# 什么更快,锁还是线程。中断?
我有一个程序,涉及在一个线程上从网络接收数据包,然后通知其他线程该数据包已被接收。我目前的方法使用Thread.Interrupt,它在传输大量数据时似乎有点慢。使用“锁”来避免使用许多中断会更快吗?或者锁在其实现中真的只是调用Interrupt()。我不明白为什么要使用C# 什么更快,锁还是线程。中断?,c#,multithreading,networking,C#,Multithreading,Networking,我有一个程序,涉及在一个线程上从网络接收数据包,然后通知其他线程该数据包已被接收。我目前的方法使用Thread.Interrupt,它在传输大量数据时似乎有点慢。使用“锁”来避免使用许多中断会更快吗?或者锁在其实现中真的只是调用Interrupt()。我不明白为什么要使用线程。Interrupt而不是一些更传统的信令方法来通知等待的线程接收到数据线程。中断要求目标线程无论如何都处于等待状态,那么为什么不添加一个对象,您可以向目标线程的等待逻辑发送信号,并使用它来触发新数据呢 lock用于保护关键
线程。Interrupt
而不是一些更传统的信令方法来通知等待的线程接收到数据<代码>线程。中断要求目标线程无论如何都处于等待状态,那么为什么不添加一个对象,您可以向目标线程的等待逻辑发送信号,并使用它来触发新数据呢
lock
用于保护关键代码或数据不被其他线程执行,不适合作为线程间活动信令的机制
在合适的对象上使用
WaitOne
或WaitAll
,而不是任何一种lock
都不适合发送信号给其他线程
用于拨动或取消拨动BCL中的一个阻塞调用李>Thread.Interrupt
用于防止同时访问资源或代码块lock
- (或)
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中新的并行化功能也可能对您的应用程序非常有帮助(如果可以选择的话)。在很多地方,您可以找到建议,避免在应用程序中使用“正常”控制流的异常。在我看来,这将决定
线程。首先中断。问题是;是否在“锁”内部引发异常,从而使这两个异常等价?既不是锁也不是线程。中断似乎是实现线程间通信或同步的合理方式。我甚至不知道在这种情况下你会怎么想使用锁。但我很确定我能回答最后一个问题——我不相信锁在内部使用线程。中断。我肯定是在你的设计中遗漏了什么。如果目标线程准备好处理新数据,它们可以等待某个对象并立即获得通知(这不是状态变量轮询,正如您所想的那样?)。如果您的目标线程没有处于处理新数据的正确状态,那么“删除所有内容,这里是新数据”信令方法的价值是什么?查阅了WaitHandle的文档,它看起来应该工作得很好。Steve和Brian没有建议您轮询任何内容。等待功能正在阻塞,如果信号正确,将“立即”返回。此外,如果一个数据包需要发送信号给一个线程,则“传统”的做法是将数据包接收到一个已分配的结构/类实例中,并仅传输指针/引用。无论涉及多少数据,“传输”都需要相同的时间。@IDWMaster-WaitHandle
通常是@Brian Gideon列出的同步对象的超类-从该列表中选择您的毒药,祝您好运。正如其他人所提到的,Thread.Interrupt是奇怪和非标准的。事实上,直到现在我才听说过它,而且我在.NET中做多线程已经很多年了。如果您想要的是易于维护、易于理解的代码,那么上面的示例不会变得简单。这正是我几十年来进行线程间通信的方式。在我使用过的每个操作系统中都可以使用某种形式的“lock()”、“semaphore.signal”和“semaphore.wait”。一旦你再往下看,看看无锁队列、联锁交换、condvar等。事情开始变得依赖于平台/CPU/OS:(