條件變量之虛假喚醒

當線程從等待已發出信號的條件變量中醒來,卻發現它等待的條件不滿足時,就會發生虛假喚醒。之所以稱為虛假,是因為該線程似乎無緣無故地被喚醒了。但是虛假喚醒不會無緣無故發生:它們通常是因為在發出條件變量信號和等待線程最終運行之間,另一個線程運行并更改了條件。線程之間存在競爭條件,典型的結果是有時,在條件變量上喚醒的線程首先運行,贏得競爭,有時它運行第二,失去競爭。
在許多系統上,尤其是多處理器系統上,虛假喚醒的問題更加嚴重,因為如果有多個線程在發出信號時等待條件變量,系統可能會決定將它們全部喚醒,將每個signal( )喚醒一個線程視為broadcast( )喚醒所有這些,從而打破了信號和喚醒之間任何可能預期的 1:1 關系。如果有 10 個線程在等待,那么只有一個會獲勝,另外 9 個會經歷虛假喚醒。
為了讓實現在處理操作系統內部的錯誤條件和競爭時具有靈活性,即使沒有發出信號,也可以允許條件變量從等待中返回,盡管目前尚不清楚有多少實現實際這樣做。在條件變量的 Solaris 實現中,如果進程發出信號,則可能會發生虛假喚醒而沒有發出條件信號;等待系統調用中止并返回EINTR。條件變量的 Linux pthread 實現保證它不會那樣做。
因為只要有競爭甚至可能在沒有競爭或信號的情況下都可能發生虛假喚醒,因此當線程在條件變量上喚醒時,它應該始終檢查它所尋求的條件是否得到滿足。如果不是,它應該回到條件變量上睡覺,等待另一個機會。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447105.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

拷貝構造函數和拷貝賦節省代碼最好用一個私有的函數

令 copy assignment操作符調用copy構造函數是不合理的,因為這就像試圖構造一個已經存在的對象。這件事如此荒涔,乃至于根本沒有相關語法。是有一些看似如你所愿的語法,但其實不是;也的確有些語法背后真正做了它,但它們…

解決Dr.com上不了網的問題

如果軟件安裝之后上不了網,會顯示出錯的信息,可以針對所顯示的問題,去定向搜索。 如果是軟件自身的問題,進入終端頁面,可以使用一下這條命令 netsh winsock reset 然后需要重啟電腦

terminate called after throwing an instance of ‘std::logic_error‘ what(): basic_string::_M_constr

terminate called after throwing an instance of ‘std::logic_error’ what(): basic_string::_M_construct null not valid 用0初始化字符串 編譯不報錯

密鑰協商(密鑰交換)機制的講解

國標文件涉及密鑰協商算法的函數 生成密鑰協商參數并輸出計算會話密鑰產生協商數據并且計算會話密鑰 密鑰協商(交換)算法及其原理 密鑰交換/協商目的 “密鑰協商機制”是:(在身份認證的前提下)規避【偷窺】的風險。…

基于ECC算法的秘鑰協商

基于ECC算法的衍生算法 ECDH(ECCDH)RSAECDHE(ECCDHE) ECDH密鑰協商(ECCDH) 橢圓曲線密碼學是屬于非對稱密碼學的,其私鑰的計算公式如下: 私鑰是一個隨機數d,取值范圍在1……n-1,其中n是子群的階公鑰是點HdG&#xff…

C++11 多線程相關知識的學習

C多線程類Thread(C11) C11中std命名空間將Boost庫中的Thread加入,Boost的多線程從準標準變為標準,這里將其用法整理復習,以demo的形式復習,還是喜歡看我自己寫的東西,符合我的個人邏輯頭文件為…

vscode vim 插件自定義配置

{"workbench.colorTheme": "Material Theme","files.defaultLanguage": "markdown", //新建文檔格式為markdown格式"vim.easymotion": true,"vim.leader": " ", // leader鍵"vim.useSystemClipbo…

C++11 explicit關鍵字的作用

explicit 在C中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隱式類型轉換,只能以顯示的方式進行類型轉換。因為無參構造函數和多參構造函數本身就是顯示調用的。再加上explicit關鍵字也沒有什么意義…

c++ 指針的強制類型轉換

#include <iostream> using namespace std; class A { public:int i;int j;A(int n):i(n),j(n) { } }; int F2 (int,char *){return 1; }; int F1 (int){return 2; }; int main() {A a(100);int &r reinterpret_cast<int&>(a); //強行讓 r 引用 ar 200; …

C++11學習 virtual(虛函數)的用法

Virtual虛函數 在面向對象的C語言中&#xff0c;虛函數&#xff08;virtual function&#xff09;是一個非常重要的概念。因為它充分體現了面向對象思想中的繼承和多態性這兩大特性&#xff0c;在C語言里應用極廣。多態性&#xff1a;其含義就是多種形式&#xff1b;將具有繼承…

c++ const

函數名稱不單單是函數名 const 補充內容 還有 const 參數類型 函數后頭const 只能在成員函數如果const對象 但是我沒通過const成員函數 就會報錯

C++11學習 新特性之 “=default” 、“=delete”

文章目錄 1、 default 和delete 概述2、 類與默認函數3、 使用“delete”來限制函數生成4、 “default”使用范圍 1、 default 和delete 概述 default、delete 是C11的新特性&#xff0c;分別為&#xff1a;顯式缺省(告知編譯器生成函數默認的缺省版本)和顯式刪除(告知編譯器…

C++學習 優雅的實現對象到文件的序列化/反序列化 關鍵字serialize

需要使用到序列化場景的需求 在寫代碼的過程中&#xff0c;經常會需要把代碼層面的對象數據保存到文件&#xff0c;而這些數據會以各種格式存儲&#xff0e;例如&#xff1a;json&#xff0c;xml&#xff0c;二進制等等&#xff0e;二進制&#xff0c;相比json&#xff0c;xml…

C++代碼注釋詳解

常用注釋語法 注釋寫在對應的函數或變量前面。JavaDoc類型的多行注釋風格如下&#xff1a; /** * 這里為注釋. */ 一般注釋中有簡要注釋和詳細注釋&#xff0c;簡要注釋有多種標識方式&#xff0c;這里推薦使用brief命令強制說明&#xff0c;例如&#xff1a;/** * brief 這里…

段錯誤:SIGSEGV

SIGSEGV是在訪問內存時發生的錯誤&#xff0c;它屬于內存管理的范疇 SIGSEGV是一個用戶態的概念&#xff0c;是操作系統在用戶態程序錯誤訪問內存時所做出的處理。 當用戶態程序訪問&#xff08;訪問表示讀、寫或執行&#xff09;不允許訪問的內存時&#xff0c;產生SIGSEGV。 …

web3 0.2.x 和 1.x.x版本之間的差異

版本差異 單位轉換 0.2.x web3.fromWei(13144321,ether) 1.x.x web3.utils.fromWei(13144321,ether)1.0以后的版本使用了大量的Promise&#xff0c;可以結合async/await使用&#xff0c;而0.20版本只支持回調函數

如何提高閱讀源碼的能力并且手撕源碼

怎么有效的手撕代碼呢&#xff1f; 把代碼跑起來把代碼一個片段拿出來使用畫出代碼運行的流程圖一行一行的搬運在看源碼的情況下寫出類似的demo

并發和并行的區別簡單介紹

并發和并行 并發是關于正確有效地控制對共享資源的訪問 同時完成多個任務。在開始處理其他任務之前&#xff0c;當前任務不需要完成。并發解決了阻塞發生的問題。當任務無法進一步執行&#xff0c;直到外部環境發生變化時才會繼續執行。最常見的例子是I/O&#xff0c;其中任務…

手撕源碼 alloc

怎么有效的手撕代碼呢&#xff1f; gnu gcc 2.9 的 內存池 把代碼跑起來把代碼一個片段拿出來使用畫出代碼運行的流程圖一行一行的搬運在看源碼的情況下寫出類似的demo 第三步&#xff1a; 第五步: // 這個頭文件包含一個模板類 allocator&#xff0c;用于管理內存的分配、…