2016-12-16 85 views
5

C11和C++ 11根據執行線程定義原子。而在託管環境中,清楚線程是什麼,這在獨立語言實現中是一個模糊的術語。如何理解獨立C或C++實現中的原子?

  1. 如何在獨立實現中正式理解C11和C++ 11中指定的原子,其中所有線程都必須在程序內部實現?例如:ISR是一個獨立的執行線程嗎?
  2. 爲什麼標準委員會在線程方面定義了原子,而不是簡單地在代碼排序領域?
  3. 除gcc外,是否有嵌入式編譯器支持C11/C++ 11原子?
+0

請注意C++ 11在'[intro.multithread]/1'中定義了* thread *。 – NathanOliver

+0

如果你只有ISR的,而不是多個處理器/內核,我會說標準的相關部分是信號的相關部分,而不是線程。 – EOF

+0

@NathanOliver謝謝,刪除了這個問題的句子。 – mrn

回答

3

我對這類問題的有些機械論(也有些手腳)的方法是,原子保證三件事情:讀取和寫入不會被上下文切換撕裂(所以您只能看到實際存儲在變量中的值);緩存得到刷新(所以你看不到陳舊的值);編譯器不能在整個原子操作中移動指令(所以在原子訪問之前邏輯上發生的操作實際上是在訪問之前發生的)。請注意,我儘量避免使用任何「線程」的概念,儘管它有點費力。

如果您正在編寫自己的線程機制,這些屬性顯然很重要。它們與您正在使用的線程機制的細節正交。

對於信號處理程序,當您需要檢查信號處理程序中執行的代碼的值以及信號處理程序需要修改程序的其餘部分所關心的值時,它們爲您提供了一個站點。

我不確定標準是否正式解決了ISR的問題(很確定它沒有),但是從這個機械角度來看,ISR和來自raise的呼叫沒有什麼不同。它只是一個異步函數調用,它佔用了從被中斷的線程獲得的堆棧空間。這絕對是不是一個線程;它是現有線程上的寄生蟲。所以對於ISR,我會爲信號保證,而不是線程保證。

+0

我仍然想知道的一件事是,爲什麼標準沒有基於你寫的三個保證來定義原子,而沒有「線程」的概念。如果是這樣的話,毫無疑問,裸機語言實現的原子意味着什麼。 – mrn

+0

@mrn - 我想這正是因爲我寫的是機械的和揮手的。標準試圖根據抽象機器來定義C++的語義,並且它目前沒有「撕裂」或「緩存」的概念。事實上,抽象機器中很少有關於內存的內容,這是故意的,以避免包含過多的系統。如果你仔細觀察,你會發現,當你調用'operator new'或'operator delete'時,你得到的唯一承諾是第一個「分配存儲」,第二個「回收...存儲」...... –

+0

...所以對於原子,主要用途是在線程之間傳遞值,而定義是在線程之間共享值時發生的。 –

3

原子學是處理競爭條件,所以沒有線程他們幾乎沒有意義。唯一可能出現的種族背景是信號處理程序,C標準提供了無鎖定的概念。

這樣看來,獨立式和託管環境之間沒有區別。線程和原子是可選功能,如果獨立環境支持兩者,則它必須符合兩者的規範。如果它只支持原子,它可以爲信號處理程序提供無鎖的原子類型,但其他原子類型則是無用的。