」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 「易失性」在 C++11 多執行緒中仍然相關嗎?

「易失性」在 C++11 多執行緒中仍然相關嗎?

發佈於2024-11-16
瀏覽:614

Is `volatile` Still Relevant in C  11 Multithreading?

C 11 中的Volatile 變量

C 11 中的Volatile 變量

C 11 標準中多線程機器模型的引入引發了有關volatile 行為的問題變量,傳統上用於防止可能導致並發環境中未定義行為的最佳化。

在C 98/03 中,內存模型中缺乏對多線程的識別意味著編譯器可以優化無法讀取易失性變量,從而導致臭名昭著的無休止while 循環等待變量更改其值的範例。 但是,C 11 記憶體模型承認並發存取變數的可能性。這是否意味著 volatile 現已被棄用?

編譯器最佳化與未定義行為



答案在於 C 11 記憶體模型的細微差別。雖然它識別多線程,但它並不能消除在沒有正確同步的情況下訪問變數時出現未定義行為的可能性。即使在多執行緒環境中,對共享變數的非原子存取仍然是未定義的。

volatile int x;

void func() {

x = 0;

while (x = = 0) {}

}因此,在在我們的範例程式碼中,編譯器仍然可以自由地最佳化while 迴圈中x 的讀取,從而導致未定義的行為。易失性僅影響記憶體訪問,而不影響線程行為。

記憶體屏障和線程完整性

線程完整性需要適當的同步機制,以確保一個線程中的寫入對另一個線程的可見性。 C 11 記憶體模型專門定義了寫入何時以及如何對其他執行緒可見。易失性不符合此要求。 易失性保證編譯器無法優化從變數讀取的內存,但它不提供有關線程可見性的任何保證。由同步結構(如鎖或原子操作)發出的記憶體屏障對於確保寫入在核心之間同步是必要的。

結論

Is `volatile` Still Relevant in C  11 Multithreading?

在 C 11 中,易失性仍然相關用於防止可能導致不正確的記憶體存取的最佳化。然而,這對於多執行緒程式設計來說還不夠。仍然需要適當的同步機制來確保並發環境中執行緒的完整性和定義的行為。

最新教學 更多>
  • 如何使用 CSS 響應式地建立具有兩個不同邊框的圓?
    如何使用 CSS 響應式地建立具有兩個不同邊框的圓?
    響應式設計具有雙邊框的圓圈創建 CSS 圓圈非常簡單,如提供的工作 CSS 所示。然而,要實現具有兩個不同邊框的圓,我們需要採用額外的 CSS 技術。 使用提供的HTML 結構,其中單一 元素代表圓:<div></div>我們可以如下修改CSS來創建一個有兩個邊框的圓:div...
    程式設計 發佈於2024-11-16
  • 如何在單一 MySQL 操作中聲明任務的所有權並檢索其資料?
    如何在單一 MySQL 操作中聲明任務的所有權並檢索其資料?
    透過單一操作在MySQL 中實現行所有權和資料擷取:當使用多個工作程序應用程式循環執行任務時,它確保每個應用程式有效地聲明對唯一任務的所有權可能具有挑戰性。 MySQL 提供了 UPDATE 和 SELECT 命令來完成此操作,但單獨執行它們可能會引入延遲和潛在的競爭條件。 要簡化流程,請考慮以下方...
    程式設計 發佈於2024-11-16
  • 如何處理 ReactJS 中的 GET 請求重新導向和 CORS 錯誤?
    如何處理 ReactJS 中的 GET 請求重新導向和 CORS 錯誤?
    在ReactJS 中處理GET 請求重定向和CORS 錯誤當ReactJS 應用程式向伺服器發送GET 請求並接收時遇到CORS錯誤302 重定向可能是一個令人沮喪的問題。以下提供了此問題的解決方案:要解決您的場景中的 CORS 錯誤,其中 ReactJS 前端 (f.com) 請求路徑“/user...
    程式設計 發佈於2024-11-16
  • 如何在 React Router v4/v5 中建立嵌套路由?
    如何在 React Router v4/v5 中建立嵌套路由?
    React Router v4/v5 的嵌套路由嵌套路由可讓您在 React 應用程式中建立用於導航的分層結構。在 React Router v4 和 v5 中,您可以透過使用 和 元件來實現這一點。 範例考慮以下範例,我們希望將應用程式劃分為前端和管理區域。 <Match pattern...
    程式設計 發佈於2024-11-16
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-16
  • 如何在 PHP 迴圈中建立動態變​​數?
    如何在 PHP 迴圈中建立動態變​​數?
    循環中的動態變數建立:綜合答案要在循環中建立變數,您可以採用以下技術:1。基於循環計數器的變數:如您所提到的,您希望變數隨著每次循環迭代而遞增。為此,您可以使用以下語法:for ( $counter = 1; $counter <= $aantalZitjesBestellen; $count...
    程式設計 發佈於2024-11-16
  • 如何衡量 Go 整合測試的測試覆蓋率?
    如何衡量 Go 整合測試的測試覆蓋率?
    確定Go 整合測試中的測試覆蓋率整合測試旨在評估整個系統的功能,通常透過模擬或控制外部依賴。然而,確定整合測試的測試覆蓋率提出了獨特的挑戰。 測量非包測試中的覆蓋率在所描述的場景中,測試與包是分開的他們測試。因此, go test -cover 指令報告覆蓋率為 0%。為了解決這個問題,可以使用 -...
    程式設計 發佈於2024-11-16
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-16
  • C++ 程式設計師如何使用 NPAPI 開發強大的瀏覽器外掛程式?
    C++ 程式設計師如何使用 NPAPI 開發強大的瀏覽器外掛程式?
    製作瀏覽器外掛:C 程式設計師指南增強網頁瀏覽器的專業功能需要開發瀏覽器外掛程式。然而,編寫這些插件的過程提出了問題,特別是對於打算使用 C 為 Windows 編寫插件的人。 開發瀏覽器外掛程式的關鍵在於利用 Netscape 外掛程式介面 (NPAPI)。 NPAPI 使開發人員能夠建立處理特定...
    程式設計 發佈於2024-11-16
  • 如果 `std::move` 實際上沒有移動任何東西,為什麼它被稱為 `std::move`?
    如果 `std::move` 實際上沒有移動任何東西,為什麼它被稱為 `std::move`?
    為什麼 std::move 命名為 std::move? std::move 函數儘管有它的名字,但它實際上並沒有移動任何東西。它只是將左值(引用物件的表達式)轉換為右值(表示臨時物件的表達式)。此轉換是透過轉換為 xvalue 類別來執行的,這與左值和純右值不同。 這種命名選擇的原因可以追溯到該概...
    程式設計 發佈於2024-11-16
  • 如何在懸停時使元素背景顏色變暗而不影響透明度?
    如何在懸停時使元素背景顏色變暗而不影響透明度?
    使用CSS 使元素背景顏色變暗增強用戶界面涉及透過改變交互元素(例如按鈕)的外觀來突出顯示它們。一種常見的方法是在懸停時使背景顏色變暗。 最初,人們可能會嘗試調整不透明度,但這會影響顏色和透明度。存在更有針對性的解決方案。 方法:疊加深色圖層使用背景影像建立深色疊加層。此方法保留了原始文字顏色,同時...
    程式設計 發佈於2024-11-16
  • CSS3 轉換與 jQuery 動畫:iPad HTML5 應用程式哪個更快?
    CSS3 轉換與 jQuery 動畫:iPad HTML5 應用程式哪個更快?
    效能比較:CSS3 轉換與jQuery 動畫在iPad HTML5 應用程式中,您實現了觸控事件以提高回應速度並利用用於元素操作的jQuery。然而,您正在爭論是使用 jQuery 動畫還是 CSS3 動畫轉換。讓我們深入研究一下它們的性能比較。 根據基準研究,jQuery 動畫的執行速度明顯慢於 ...
    程式設計 發佈於2024-11-16
  • 三元條件運算子在程式設計中如何運作?
    三元條件運算子在程式設計中如何運作?
    理解三元條件運算子程式設計中,使用問號(「?」)和冒號(「:」)運算子括號內形成三元條件運算子。它提供了傳統 if-else 語句的簡潔替代方案,可讓您評估條件並根據其真實性分配值。 語法和用法The三元運算子遵循語法:boolean_expression ? true_value : false_...
    程式設計 發佈於2024-11-16
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-16
  • 如何存取 Maven 依賴項的原始程式碼和 Javadoc?
    如何存取 Maven 依賴項的原始程式碼和 Javadoc?
    在 Maven 儲存庫中尋找來源 JARMaven 是一種流行的 Java 專案包管理工具,提供了廣泛的庫及其依賴項儲存庫。通常,開發人員需要存取與這些依賴項關聯的原始程式碼或 Javadoc,以進行偵錯或文件記錄。 雖然Maven 儲存庫通常儲存二進位JAR 文件,但有一種方法可以使用Maven ...
    程式設計 發佈於2024-11-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3