Windows編程--成功等待的副作用

來源:互聯網
上載者:User


對於有些核心對象來說,成功地調用WaitForSingleObject和WaitForMultipleObjects,實際上會改變對象的狀態。成功地調用是指函數發現對象已經得到通知並且返回一個相對於WA I T _O BJECT_ 0的值。如果函數返回WAIT_TIMEOUT或WAIT_FAILED,那麼調用就沒有成功。如果函數調用沒有成功,對象的狀態就不可能改變。

當一個對象的狀態改變時,我稱之為成功等待的副作用。例如,有一個線程正在等待自動清除事件對象。當事件對象變為已通知狀態時,函數就會發現這個情況,並將WAIT_OBJECT_0返回給調用線程。但是就在函數返回之前,該事件將被置為未通知狀態,這就是成功等待的副作用。

這個副作用將用於自動清除核心對象,因為它是Microsoft為這種類型的對象定義的規則之一。其他對象擁有不同的副作用,而有些對象則根本沒有任何副作用。進程和線程核心對象就根本沒有任何副作用。

究竟是什麼原因使得WaitForMultipleObjects函數如此有用呢,因為它能夠以原子操作方式來執行它的所有操作。當一個線程調用WaitForMultipleObjects函數時,該函數能夠測試所有對象的通知狀態,並且能夠將所有必要的副作用作為一項操作來執行。

讓我們觀察一個例子。兩個線程以完全相同的方式來調用WaitForMultipleObjects:

 

HANDLE h[2];
h[0] = hAutoResetEvent1; // Initially nonsignaled
h[1] = hAutoResetEvent2; // Initially nonsignaled
WaitForMultipleObjects(2, h, TRUE,INFINITE);

 

 

當WaitForMultipleObjects函數被調用時,兩個事件都處於未通知狀態,這就迫使兩個線程都進入等待狀態。然後hAutoResetEvent1對象變為已通知狀態。兩個線程都發現,該事件已經變為已通知狀態,但是它們都無法被喚醒,因為hAutoResetEvent2仍然處於未通知狀態。由於兩個線程都沒有等待成功,因此沒有對hAutoResetEvent1對象產生任何副作用。

接著,hAutoResetEvent2變為已通知狀態。這時,兩個線程中的一個發現,兩個對象都變為已通知狀態。等待取得了成功,兩個事件對象均被置為未通知狀態,(等待成功後就會被重新置為未通知狀態)該線程變為可調度的線程。但是另一個線程的情況如何呢?它將繼續等待,直到它發現兩個事件對象都處於已通知狀態。儘管它原先發現hAutoResetEvent1處於已通知狀態,但是現在它將該對象視為未通知狀態。

前面講過,有一個重要問題必須注意,即WaitForMultipleObjects是以原子操作方式啟動並執行。當它檢查核心對象的狀態時,其他任何線程都無法背著對象改變它的狀態。這可以防止出現死結情況。試想,如果一個線程看到hAutoResetEvent1已經得到通知並將事件重設為未通知狀態,然後,另一個線程發現hAutoResetEvent2已經得到通知並將該事件重設為未通知狀態,那麼這兩個線程均將被凍結:一個線程將等待另一個線程已經得到的對象,另一個線程將等待該線程已經得到的對象。WaitForMultipleObjects能夠確保這種情況永遠不會發生。

FangSH 2011-01-05

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.