发出手动重置事件时, 等待事件的所有线程 变得可调度。当自动重置 事件发出信号,只有一个 等待事件的线程变成了 调度。
我在这里有一些非常棒的问题,因为我是线程新手。
答案 0 :(得分:1)
想想一下灯开关。当“发出信号”事件时,灯开关打开。当事件“重置”时,灯开关关闭。
自动复位事件意味着在事件发出信号(打开)并释放线程后,事件将自动复位(关闭)。手动复位事件仍会发出信号(打开),直到手动复位(关闭)为止。
见上面的#1。
当一个线程正在等待一个事件时,该线程被阻塞,这意味着它无法被操作系统安排工作。当线程等待的事件被设置(发信号,打开)时,线程被释放,即变得可调度。这只是意味着操作系统现在可以安排线程工作。
等待某个活动只是意味着在某个活动上调用其中一个Wait()
个功能。线程将“等待”,直到事件设置/发出信号/开启,然后继续进行任何工作。
答案 1 :(得分:0)
基本上,“WaitHandle”(包括手动重置事件和自动重置事件)是允许线程等到事情发生的类型 - 在这种情况下,直到WaitHandle为“Set”。
一个线程(线程A)可以在WaitHandle上“等待”,阻塞直到一个单独的线程(线程B)“设置”(==“发出信号”)WaitHandle。这将允许线程A在该点继续。
如果有多个线程在WaitHandle上等待,则会发生主要区别。在这种情况下,使用手动重置事件,将允许所有线程继续(即:它们现在可以调度,这意味着操作系统将设置它们并在某些时候再次运行它们,通常很快)。使用自动重置事件,允许一个线程继续,并且WaitHandle被“重置”,这将阻止其他线程继续(直到WaitHandle再次发出信号,当下一个线程被“释放”时)。
答案 2 :(得分:0)
解决您的每个问题:
1)当一个事件被重置时,这意味着现在可以发信号通知另一个等待该事件的线程。换句话说,现在正在休眠(阻塞)的线程可以被唤醒以进行工作。
2)根据Event Objects (MSDN),
手动重置事件:一种事件对象,其状态保持信号状态,直到它被ResetEvent函数显式重置为无信号。在发出信号时,可以释放任意数量的等待线程或随后在其中一个等待函数中指定相同事件对象的线程。
自动重置事件:一个事件对象,其状态保持信号状态,直到释放单个等待线程,此时系统自动将状态设置为无信号状态。 如果没有线程在等待,则事件对象的状态仍然发出信号。如果有多个线程在等待,则选择等待线程。不要假设先进先出(FIFO)顺序。内核模式APC等外部事件可以更改等待顺序。
因此,基本上使用手动重置事件,您可以显式重置事件,触发任意数量的线程来执行。通过自动重置事件,操作系统可确保在发出事件信号时只执行一个线程。
3)对,当发出事件信号时,线程正在使用该事件来执行工作。尝试访问(发送)事件的任何其他线程都将被阻止。
4)在此上下文中,可调度意味着可以执行线程。根据事件设置,操作系统将选择一个或多个等待事件的线程,并执行它们。
5)等待事件意味着线程在事件对象上阻塞。在被阻塞时,线程没有执行任何CPU周期,并且基本上被操作系统“暂停”。