2010-07-28 47 views
1

当发出手动重置事件时, 等待事件 的所有线程都可以调度。当发送自动重置事件 事件时,等待事件的 线程中只有一个变为 可调度。关于简单线程问题的提问

我有一些真正的noob问题在这里问,因为我是新的线程。

  1. “设置”和“重置”事件意味着什么?
  2. 手动复位和自动复位事件有什么区别?
  3. 当一个事件“发出信号”时,这意味着什么?这是否意味着它被激活?
  4. 线程变得“可调度”是什么意思?
  5. 什么是“等待事件”?
+0

这功课吗? – 2010-07-28 15:58:09

+0

不..这是为了自学:) – Robogal 2010-07-28 16:00:29

回答

0

基本上,“WaitHandle”(包括手动重置事件和自动重置事件)是允许线程等待直到发生什么事情的类型 - 在这种情况下,直到WaitHandle为“Set”。

线程(线程A)可以在WaitHandle上“等待”,直到单独的线程(线程B)“设置”(==“信号”)WaitHandle为止。这将允许线程A在该点继续。

如果您有多个等待WaitHandle的线程,则会出现主要差异。在这种情况下,通过手动重置事件,所有线程都将被允许继续运行(即:它们现在可以调度,这意味着操作系统将设置它们并在某个时刻再次运行,通常很快)。使用自动重置事件时,允许一个线程继续,并且WaitHandle处于“重置”状态,这可以防止其他线程继续(直到WaitHandle再次发出信号,而下一个线程“释放”时)。

0

为了解决您的每一个问题:

1)当事件被复位,则意味着另一个线程等待该事件现在可以发出信号。换句话说,现在正在睡觉(阻塞)的线程可以被唤醒来工作。

2)根据Event Objects (MSDN)

  • 手动重置事件:事件对象,其状态保持用信号,直到它被明确地复位到由ResetEvent功能无信号。在发出信号时,可释放任意数量的等待线程或随后在其中一个等待函数中指定相同事件对象的线程。

  • 自动复位事件:事件对象,其状态保持用信号,直到单个等待线程被释放,在此时,系统自动设置的状态到无信号。 如果没有线程在等待,则事件对象的状态保持发送状态。如果有多个线程正在等待,则选择一个等待线程。不要采用先入先出(FIFO)的顺序。外部事件(如内核模式APC)可以更改等待顺序。

因此,基本上手动重置事件可以显式重置事件,触发任意数量的线程执行。通过自动重置事件,操作系统保证当事件发出信号时,只有一个线程会执行。

3)对,当一个事件发出信号时,一个线程正在使用该事件来执行工作。试图访问(信号)事件的任何其他线程将被阻止。

4)在这种情况下,可调度意味着可以执行一个线程。根据事件设置,操作系统将选择一个或多个等待事件的线程,并执行它们。

5)等待事件意味着线程阻塞事件对象。当被阻塞时,线程不会执行任何CPU周期,并且基本上被操作系统“搁置”。

1
  1. 想想灯开关。当事件“发信号”时,灯开关打开。当事件“重置”时,灯开关关闭。

  2. 自动重置事件意味着事件发出信号(打开)并释放线程后,事件会自动重置(关闭)。手动重置事件保持发出信号(打开),直到手动重置(关闭)。

  3. 参见上面的#1。

  4. 当一个线程正在等待一个事件时,该线程被阻塞,这意味着它不能被调度为由操作系统工作。当线程正在等待的事件被设置(发信号,打开)时,线程被释放,即变得可调度。这只是意味着操作系统现在可以安排线程工作。

  5. 等待事件只是表示在事件中调用Wait()函数之一。在继续进行任何工作之前,线程将“等待”,直到事件被设置/信号/开启。