2012-02-18 120 views
4

更具体地说,上下文切换的性能下降是否适用于处于等待状态的线程?ManualResetEvent在处于等待状态时会消耗CPU吗?

在什么条件或情况下ManualResetEvent或WaitHandle可能会消耗资源?

+0

您是否期待这个问题的答案出现在这里或您的[其他问题](http://stackoverflow.com/questions/9343358/is-this-background-thread-queue-a-performant-implementation )你今天发布的帖子(包含相同的问题)? – 2012-02-18 18:42:32

+1

我们需要一些代码示例来了解发生这种情况的原因。 – JaredPar 2012-02-18 18:42:57

+2

好吧,显然这个问题是不能接受的,所以我试图做到这一点。 – 2012-02-18 18:43:16

回答

5

ManualResetEvent没有等待状态。唯一可以在MRE上等待的是线程。是的,当一个线程没有做它做的事情时,它会不必要地占用大量的宝贵资源,执行代码。一个兆字节的虚拟内存和一些内核对象。与此相比,MRE消耗的单个内核对象是小土豆。

您通常希望使用线程池线程来代替。

并查看.NET 4.0中可用的内容。像ManualResetEventSlim(不基于OS对象)和Task类一样。

+0

感谢您参考ManualResetEventSlim。我甚至不知道这存在。当然有些情况下我们会比等待更好。 – 2012-02-19 17:48:33

2

在ManualResetEvent的情况下,no。该线程实际上并没有循环,或任何东西。它只是将自己的引用填入ManualResetEvent的通知列表中。当另一个线程调用ManualResetEvent时,另一个线程结束等待线程回到活动队列。

消耗的资源仅仅是线程存在的计算:堆栈,记录的内核资源,保存的寄存器等。现在,如果您所说的线程没有使用ManualResetEvent,而是使用了ManualResetEvent一定的等待循环,然后肯定。

现在,WaitHandle不是一个实现。这是一个抽象的API。没有说明WaitHandle的其他实现可能如何工作。