C語言的 Atomic型別限定符 C11

2021-10-07 13:32:43 字數 832 閱讀 7408

併發程式設計把程式執行分成可以同時執行的多個執行緒。這程式設計帶來了新的挑戰,包括如何管理訪問相同資料的不同執行緒。c11通過包含可選的標頭檔案stdatomic.h和threads.h,提供了一些可選的(不是必須實現的)管理方法。值得注意的是,要通過各種紅函式類訪問原子型別。當乙個執行緒對乙個原子型別的物件執行原子操作時,其他執行緒不能訪問該物件。

所謂原子操作,就是該操作絕不會在執行完畢前被任何其他任務或事件打斷,也就說,它的最小的執行單位,不可能有比它更小的執行單位,因此這裡的原子實際是使用了物理學裡的物質微粒的概念。

所以這裡說到的原子操作,基本都包含我們三個方面所關心的語義:操作本身是不可分割的(atomicity),乙個執行緒對某個資料的操作何時對另外乙個執行緒可見(visibility),執行的順序是否可以被重排(ordering)。

這有點類似互斥物件對共享資源的訪問的保護,但是原子操作更加接近底層,因而效率更高。

例如下面的**:

int hogs;

//普通宣告

hogs=12;

//普通賦值

可以替換成:

_atomic

int hogs;

//hogs是乙個原子型別的變數

atomic_store

(&hogs,12)

;中的巨集

這裡,在hogs中儲存12是乙個原子過程,其他執行緒不能訪問hogs。

編寫這種**的前提是,編譯器要支援這一新特性。

C語言的const型別限定符

我們通常用型別和儲存類別來描述乙個變數。c90還增加了兩個屬性 恆常性 constancy 和易變性 volatility 這兩個屬性分別用關鍵字const和volatile來宣告,以這兩關鍵字建立的型別是限定型別。c99標準新增了第3個限定符 restrict,用於提高編譯器優化。c11新增了第四...

linux volatile型別限定符

背景 一直會有意無意的看到有這個volatile,但是做為乙個在linux應用層寫了幾年 的程式設計師,還真的沒有搞懂什麼時候需要這樣用?查了一圈,網上都是各種告訴編譯器不要把該變數放到暫存器,放到暫存器,如果其它地方改了拿不到最新的值,不要優化等等 首先說下,組合語言真的屬於基本不會那種。多執行緒...

ANSIC型別限定符

以const型別關鍵字宣告的物件,其值不能通過賦值來遞增,遞減來修改。以下 const int a 12 限定a的值不能修改 a 12 不可以編譯器會報錯,但是可以初始化變數,因此下面的 沒問題 const int a 12 沒問題該宣告讓a成為唯讀變數。初始化後,就不能改變它的值。可以用const...