2009-06-11 27 views

回答

25

完全一樣非struct字段:

#include <stdio.h> 
int main (int c, char *v[]) { 
    struct _a { 
     int a1; 
     volatile int a2; 
     int a3; 
    } a; 
    a.a1 = 1; 
    a.a2 = 2; 
    a.a3 = 3; 
    return 0; 
} 

可以通過使用"volatile struct _a {...}"標記整個struct揮發性但上述方法是用於各個字段。

9

應該是相當直截了當根據this文章:

最後,如果你申請揮發到 結構或聯合的全部內容的結構/聯合的 是揮發性。如果 您不想要這種行爲,那麼您可以將 將volatile限定符應用於 結構/聯合的 個別成員。

1

只是關於C/C++ volatile關鍵字的警告。

除非你知道你在做什麼,你不應該使用它。

C/C++揮發性!=的Java/C#揮發性

震盪線程代碼不會幫助,除非你真的知道自己在做什麼,你需要使用的C++ 0x原子模板(或類似的東西)。

我唯一不得不使用volatile的是控制硬件寄存器。

+0

我認爲你已經說過比嚴格需要強一點。 volatile對線程代碼有幫助,特別是在單核心嵌入式平臺上。但是你必須知道如何使用它。在使用或不使用DMA的情況下引用硬件寄存器時,它也是有效的強制措施,特別是要查詢狀態的寄存器。還有必要了解您的緩存以及如何正確管理緩存,並瞭解如何在您的平臺上執行原子操作。 – RBerteig 2009-06-11 08:31:42

0

如果由於服務某些中斷(即信號處理程序或其他(接近)原子變量)而聲明爲volatile的成員未發生更改,那麼您應該不使用volatile(因爲大多數編譯器會將其優化掉)足夠接近)。

否則,正如其他人所說..只是用那麼它檢查ASM轉儲,看看你的編譯器實際上與你:)

在某些情況下,即同意GCC的某些版本..它值得一試的轉儲。

相關問題