2010-07-28 72 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()函數之一。在繼續進行任何工作之前,線程將「等待」,直到事件被設置/信號/開啓。