並行作業Windows Vista新增的同步原語

來源:互聯網
上載者:User

本文討論:

條件變數

Slim 讀取器鎖/寫入器鎖

一次性初始化

仔細查過鎖定

本文使用了以下技術:

Windows Vista, C++

目錄

條件變數

Slim 讀取器鎖/寫入器鎖

一次性初始化

結束語

Windows Vista 附帶了一系列面向開發人員的令人振奮的新技術,包括 Windows® Presentation Foundation、Windows Communication Foundation 和 Windows Workflow Foundation。事實上,Windows Vista™ 已引入太多新的 .NET 友好技術,因此我們很容易忽略本機 C/C++ 開發人員可用於其應用程式的所有新特性和功能。

在本文中,我們將討論影響本機 C/C++ 開發人員的一些 Windows Vista 新功能。我們將重點介紹新作業系統中引入的幾種新線程同步功能:條件變數、Slim 讀取器鎖/寫入器鎖和一次性初始化。

條件變數

條件變數在其他線程庫中已經存在一段時間了,只是很遺憾地被 Windows SDK 遺漏了。條件變數主要用來根據一些條件測試的結果同步化一組線程。儘管可通過使用現有同步結構組合來做到這一點,但是條件變數具有釋放已擷取的鎖,並通過一個原子操作進入休眠狀態的能力。它還提供了一種更清楚且又少出錯的方法,以用於實現所需的行為。

Windows SDK for Windows Vista(可供下載)公開了 CONDITION_VARIABLE 結構的條件變數。您可用 InitializeConditionVariable 函數建立該結構。沒有用來清理或銷毀 CONDITION_VARIABLE 結構的函數,因為底層實現用不著它。

通過使用函數 SleepConditionVariableCS(使用關鍵節時)或 SleepConditionVariableSRW(使用 Slim 讀取器鎖/寫入器鎖時),您可讓線程等待條件變數。當另一條線程調用 WakeConditionVariable 或 WakeAllConditionVariable 時,這些休眠線程將被釋放,這取決於調用線程是想要釋放等待條件變數的一條線程還是所有線程。

常見的生產者/使用者問題代表了可使用條件變數的情況。這一典型樣本是指生產者產生資料並將其置入緩衝區,而使用者則從緩衝區抓取待處理的資料片段的情形。該問題指出了一種需求,即保證生產者不會試圖向填滿的緩衝區添加資料,而使用者不會試圖從空緩衝區抓取資料。我們將分析本情形,以向您說明條件變數是如何協助解決問題的。

針對此例,我們將建立一個向共用隊列傳送數值資料的單一生產者線程。我們然後建立五個使用者線程。每個使用者線程將從隊列中轉移一個項目並進行處理。當處理完當前資料區段後,使用者線程將迴圈,無限重複該過程。

在早期版本的 Windows 中,可用 Win32 事件和關鍵節組合來解決生產者/使用者問題。當資源可供使用者使用時,關鍵節會保護共用資源、避免出現並發性訪問和事件訊號。

在我們首次嘗試解決這個問題時,我們將標準模板庫 (Standard Template Library, STL) 整數列表用作共用資源。由於列表會動態擴充,我們無需使用事件以訊號形式通知清單何時是未填滿的,我們只需瞭解它何時不是空的,這樣使用者就能知道其中有內容可供使用。(如果您打算使用固定大小的數組來容納共用隊列,則需要一個未滿事件,以確保您不會向緩衝區寫入過多內容。)我們隨後聲明並初始化 CRITICAL_SECTION 對象以及用於說明列表何時不為空白的自動重設事件。

圖 1 所示的生產者線程將首先嘗試擷取關鍵節,並且如果擷取成功,將隨後在共用列表的末尾插入一個整數值。該線程然後釋放關鍵節並設定非空事件。因為我們在使用一個自動重設事件,因此只釋放一個等待本事件的線程。 圖 1 所示的使用者線程將查看隊列是否為空白。如果隊列不為空白,該線程將轉移一個項目並釋放關鍵節。如果隊列為空白,使用者線程將返回休眠狀態,繼續等待非空事件。在第一個使用者線程忙於處理它從隊列轉移的項目時,生產者將喚醒另一個使用者線程拾取下一段工作以確保隊列處於移動狀態。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.