成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++ 里 ++i 是原子操作嗎?

開發
對于嵌入式開發等要求原子操作顯式控制的場景,C++11提供了一些新的原子類型和同步原語來保證操作的原子執行。?

1.什么是原子操作

在多線程環境下,原子操作是指不會被線程調度機制打斷的操作;這種操作一旦開始,就一直運行到結束,中間不會有任何 context switch (切換到另一個線程)。

原子操作可以確保某些特定操作在多線程條件下,不會由于線程切換而導致數據污染。比如,對一個變量的讀/寫操作,就是一個常見的需要原子化的場景。如果把這樣的讀/寫操作設計成原子操作,就可以避免多線程競爭導致的數據不一致問題。

2.++i 是否原子操作

在 C++ 中,對一個變量的自增(++)操作看似很簡單,理論上它包含:

  • 讀變量原值
  • 對原值加 1
  • 將結果寫回變量

例如:

int i = 0; 
++i;

但是在多線程環境下,這三個步驟如果被打斷,可能導致如下結果:

  • 線程1 讀到i=0
  • 線程2也讀到i=0
  • 線程1對i加1并寫入,現在i=1
  • 線程2對i加1并寫入,這時覆蓋了線程1的寫入,又使得i=1

很明顯,實際的運行次數是2次,但最終結果是i=1,這就是數據污染的例子。

為了避免上述情況,C++編譯器在編譯過程中,會自動將一些看似簡單的操作(例如自增操作)轉換為原子指令,從而保證其原子性。

這種特性與具體的編譯器實現相關,比如主流的GNU編譯器和MSVC編譯器都對自增操作進行了優化,確保其原子執行。

所以可以認為,在絕大多數C++實現中,++i這個自增操作是原子的。但是仍有一些例外情況需要注意,比如在嵌入式平臺上可能需要開發者顯式指定操作的原子性。

3. 如何保證操作的原子性

在不能依賴編譯器優化的情況下,C++11提供了一些方法可以保證操作的原子性:

(1) atomic類型:提供了一些原子類型,對其操作天然原子

int i = 0; 
++i;

(2) mutex:使用mutex可以在臨界區內執行一個原子塊

std::mutex m;
m.lock();
// critical section
cnt++; 
m.unlock();

(3) lock-free編程:通過CAS(compare-and-swap)等原子指令實現非阻塞同步

atomic_int val;
int expect = val.load();
while(!val.compare_exchange_weak(expect, expect + 1)) {
  expect = val.load(); 
} atomic_int val;
int expect = val.load();
while(!val.compare_exchange_weak(expect, expect + 1)) {
  expect = val.load(); 
}

4. 總結

綜上所述,在大多數普通的桌面程序和服務端程序中,++i這樣的自增操作可以看作是原子的,編譯器會做出優化。但是對于嵌入式開發等要求原子操作顯式控制的場景,C++11提供了一些新的原子類型和同步原語來保證操作的原子執行。

責任編輯:趙寧寧 來源: 鯊魚編程
相關推薦

2011-07-20 14:33:19

C++IO

2014-01-09 09:45:41

原子飛原子

2022-07-01 11:07:56

int原子操作代碼

2022-09-09 15:32:46

intC語言原子操作

2021-04-01 17:36:30

鴻蒙HarmonyOS應用開發

2011-05-24 17:20:57

程序員

2016-10-20 16:07:11

C++Modern C++異步

2023-10-04 00:38:30

C++原子

2015-09-07 13:55:53

PHPC++

2022-08-22 15:32:59

C++C代碼

2010-01-28 11:16:28

C++操作符

2011-06-17 16:09:04

freadfwrite

2020-11-27 06:44:22

原子加鎖x86

2024-04-07 09:59:42

C++并發編程開發

2010-01-21 10:23:53

C++代碼

2010-01-28 15:38:57

學習C++意義

2024-06-24 12:41:40

2010-01-27 11:00:17

C++操作符

2010-02-05 16:18:41

C++流式文件操作

2010-02-02 17:08:22

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区在线视频 | 超碰国产在线 | 欧美一级视频免费看 | 久久国产婷婷国产香蕉 | 三级高清 | 欧美精品一区二区在线观看 | 波多野结衣av中文字幕 | 婷婷丁香在线视频 | 免费毛片在线 | 午夜视频网站 | 午夜理伦三级理论三级在线观看 | 日韩欧美一区二区三区在线播放 | 91麻豆蜜桃一区二区三区 | 2019精品手机国产品在线 | 日韩欧美三区 | 国产精品视频久久 | 99精品欧美一区二区三区 | 狠狠久久 | 男女视频在线观看免费 | 成人毛片网站 | 久久国产精品视频 | 欧美日韩在线一区 | 国产欧美一区二区三区在线看 | 中文字幕在线播放第一页 | 日本精品久久久一区二区三区 | 国产精品亚洲综合 | 日韩免费福利视频 | 久久丝袜 | 97色伦网 | 国产精品一区二区av | 日本视频在线播放 | 在线观看免费av网 | 久久久久久国产精品 | 日韩一区二区在线视频 | 日韩在线精品视频 | 成人免费看片 | 日韩在线视频网址 | 亚洲成人一区 | 91精品亚洲| 日韩欧美一二三区 | 久久精品视频99 |