同步處理資料結構
並行執行時間提供數個資料結構,可讓您同步存取多個執行緒的共用資料。 當您不常修改的共用資料時,這些資料結構很有用。 例如,重要區段的同步處理物件會導致其他執行緒等到共用資源可用為止。 因此,如果您使用這類物件來同步存取經常使用的資料,您可能會在應用程式中失去延展性。 平行模式程式庫 (PPL) 提供 並行::combinable 類別,可讓您在數個執行緒或工作之間共用資源,而不需要同步處理。 如需 類別 combinable
的詳細資訊,請參閱 平行容器和物件 。
區段
本主題詳細說明下列非同步訊息區塊類型:
critical_section
concurrency::critical_section 類別代表對其他工作產生的合作互斥物件,而不是先占它們。 當多個執行緒需要共用資料的獨佔讀取和寫入存取權時,關鍵區段會很有用。
類別 critical_section
為非重新進入。 如果 已擁有鎖定的執行緒呼叫並行::critical_section::lock 方法會擲回類型 並行::improper_lock 例外狀況。
方法和功能
下表顯示 類別所 critical_section
定義的重要方法。
方法 | 描述 |
---|---|
lock | 取得重要區段。 呼叫內容會封鎖,直到取得鎖定為止。 |
try_lock | 嘗試取得重要區段,但不會封鎖。 |
unlock | 釋放重要區段。 |
[靠上]
reader_writer_lock
concurrency ::reader_writer_lock 類別為共用資料提供安全線程的讀取/寫入作業。 當多個執行緒需要共用資源的並行讀取權限,但很少寫入該共用資源時,請使用讀取器/寫入器鎖定。 這個類別隨時只提供物件一個執行緒寫入權限。
類別 reader_writer_lock
的執行效能比 critical_section
類別更好,因為 critical_section
物件會取得共用資源的獨佔存取權,這可防止並行讀取存取。
和 類別 critical_section
一樣,類別 reader_writer_lock
代表對其他工作產生的合作互斥物件,而不是先占它們。
當必須寫入共用資源的執行緒取得讀取器/寫入器鎖定時,也必須存取資源的其他執行緒會遭到封鎖,直到寫入器釋放鎖定為止。 類別 reader_writer_lock
是寫入喜好設定 鎖定的 範例,這是在解除封鎖等候讀取器之前解除封鎖等候寫入器的鎖定。
和 類別 critical_section
一樣,類別 reader_writer_lock
是非重新進入。 並行 ::reader_writer_lock::lock 和 concurrency::reader_writer_lock::lock_read 方法會在已經擁有鎖定的執行緒呼叫時擲回類型的 improper_lock
例外狀況。
注意
因為類別 reader_writer_lock
是非重新進入,所以您無法將唯讀鎖定升級為讀取器/寫入器鎖定,或將讀取器/寫入器鎖定降級為唯讀鎖定。 執行其中一項作業會產生未指定的行為。
方法和功能
下表顯示 類別所 reader_writer_lock
定義的重要方法。
方法 | 描述 |
---|---|
lock | 取得鎖定的讀取/寫入存取權。 |
try_lock | 嘗試取得鎖定的讀取/寫入存取權,但不會封鎖。 |
lock_read | 取得鎖定的唯讀存取權。 |
try_lock_read | 嘗試取得鎖定的唯讀存取權,但不會封鎖。 |
unlock | 釋放鎖定。 |
[靠上]
scoped_lock和scoped_lock_read
critical_section
和 reader_writer_lock
類別提供巢狀協助程式類別,以簡化您使用相互排除物件的方式。 這些協助程式類別稱為 範圍鎖定 。
類別 critical_section
包含 concurrency::critical_section::scoped_lock 類別。 建構函式會取得所提供 critical_section
物件的存取權;解構函式會釋放該物件的存取權。 類別 reader_writer_lock
包含 concurrency::reader_writer_lock::scoped_lock 類別,其類似 critical_section::scoped_lock
,但管理所提供 reader_writer_lock
物件的寫入權限除外。 類別 reader_writer_lock
也包含 concurrency::reader_writer_lock::scoped_lock_read 類別。 這個類別會管理所提供 reader_writer_lock
物件的讀取權限。
當您手動使用 critical_section
和 reader_writer_lock
物件時,範圍鎖定可提供數個優點。 一般而言,您會在堆疊上配置範圍鎖定。 範圍鎖定會在終結時自動釋放其互斥物件的存取權;因此,您不會手動解除鎖定基礎物件。 當函式包含多個 return
語句時,這非常有用。 範圍鎖定也可以協助您撰寫例外狀況安全程式碼。 throw
當語句導致堆疊回溯時,會呼叫任何作用中範圍鎖定的解構函式,因此一律會正確釋放互斥物件。
注意
當您使用 critical_section::scoped_lock
、 reader_writer_lock::scoped_lock
和 reader_writer_lock::scoped_lock_read
類別時,請勿手動釋放基礎互斥物件的存取權。 這可讓執行時間處於無效狀態。
event
concurrency ::event 類別代表同步處理物件,其狀態可以是訊號或非訊號。 不同于同步處理物件,例如重要區段,其用途是保護共用資料的存取、事件同步處理執行流程。
當某個工作已完成另一項工作的工作時,類別 event
會很有用。 例如,某個工作可能會向另一個工作發出訊號,指出它已從網路連線或檔案讀取資料。
方法和功能
下表顯示 類別所 event
定義的數個重要方法。
方法 | 描述 |
---|---|
等 | 等候事件收到訊號。 |
set | 將事件設定為訊號狀態。 |
reset | 將事件設定為非訊號狀態。 |
wait_for_multiple | 等候多個事件收到訊號。 |
範例
如需示範如何使用 類別的 event
範例,請參閱 比較同步處理資料結構與 Windows API 。
[靠上]
相關章節
比較同步處理資料結構與 Windows API
比較同步處理資料結構的行為與 Windows API 所提供的行為。
並行執行階段
說明並行執行階段,它可簡化平行程式設計,並包含相關主題的連結。