Can you summarize the following document?
        
  以下的C語言程式示範二個執行緒共享一個全域變數i,第一個執行緒用忙碌等待來確認變數i的值是否有改變。  上述的程式也可以用C11標準中的條件變數達成。

  大多數作業系統和執行緒庫提供了各種各樣可以阻止事件過程的系統呼叫,如鎖獲取、計時器變化,I/O可用性或訊號。使用系統呼叫來產生延遲會有最簡單、最有效、公平且沒有競爭危害的結果。一個呼叫會檢查、通知事件等待的排程程式,插入一個適用的記憶障礙,也可以在返回之前執行所請求的I / O操作。當呼叫者被堵住時,其他程序可以使用CPU。排程器有實現優先順序繼承所需的資訊或其他機制,來避免資源衰竭的問題。  在大部分作業系統中,也可以在忙碌等待中加入延遲函式(sleep()),以減少忙碌等待浪費的CPU資源。這可以讓執行緒暫停指定的時間,在此期間執行緒不會浪費CPU時間。如果迴圈檢查只是檢查一些簡單的事務,將大部分時間花費在延遲函式,則不太會浪費太多CPU時間。  若程式永遠不會結束(如作業系統),可以通過無條件跳轉(例如NASM語法中的jmp $)實現無限次的忙碌等待。CPU會永遠無條件跳轉到程式現在執行到的位置。因此可以用以下的程式取代忙碌等待:

  一些底層程式設計中可能需要用到需忙碌等待。對每個硬體裝置(尤其是偶爾才使用到的硬體)設定中斷可能不切實際甚至不可能。有時需要將某種的控制資料寫入硬體,在寫入後獲取裝置狀態,但狀態可能要在寫入後數個機器週期後才有效。程式設計師可以呼叫作業系統延遲函式,不過這樣做可能要耗費更多的時鐘周,此時就可以使用忙碌等待。
在軟體工程中,忙碌等待(也稱自旋;英語:Busy waiting、busy-looping、spinning)是一種以程序反覆檢查一個條件是否為真為根本的技術,條件可能為鍵盤輸入或某個鎖是否可用。忙碌等待也可以用來產生一個任意的時間延遲,若系統沒有提供生成特定時間長度的方法,則需要用到忙碌等待。不同的計算機處理器速度差異很大,特別是一些處理器設計為可能根據外部因素(例如作業系統上的負載)動態調整速率。因此,忙碌等待這種時間延遲技術容易產生不可預知、甚至不一致的結果,除非實現程式碼來確定處理器執行“什麼都不做”迴圈的速度,或者迴圈程式碼明確檢查實時時鐘。