Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么更快,锁还是线程。中断?_C#_Multithreading_Networking - Fatal编程技术网

C# 什么更快,锁还是线程。中断?

C# 什么更快,锁还是线程。中断?,c#,multithreading,networking,C#,Multithreading,Networking,我有一个程序,涉及在一个线程上从网络接收数据包,然后通知其他线程该数据包已被接收。我目前的方法使用Thread.Interrupt,它在传输大量数据时似乎有点慢。使用“锁”来避免使用许多中断会更快吗?或者锁在其实现中真的只是调用Interrupt()。我不明白为什么要使用线程。Interrupt而不是一些更传统的信令方法来通知等待的线程接收到数据线程。中断要求目标线程无论如何都处于等待状态,那么为什么不添加一个对象,您可以向目标线程的等待逻辑发送信号,并使用它来触发新数据呢 lock用于保护关键

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

我不明白为什么要使用
线程。Interrupt
而不是一些更传统的信令方法来通知等待的线程接收到数据<代码>线程。中断要求目标线程无论如何都处于等待状态,那么为什么不添加一个对象,您可以向目标线程的等待逻辑发送信号,并使用它来触发新数据呢

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


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

Thread.Interrupt和
lock
都不适合发送信号给其他线程

  • Thread.Interrupt
    用于拨动或取消拨动BCL中的一个阻塞调用
  • lock
    用于防止同时访问资源或代码块
使用以下机制之一可以更好地完成向其他线程发送信号

  • (或)

读写时,我通常使用标准队列和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中新的并行化功能也可能对您的应用程序非常有帮助(如果可以选择的话)。

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