2015-05-15 41 views
3

有點愚蠢的問題。例如我讀過,在C11中增加了對線程的支持。 然後,例如我的STM32F4的GCC編譯器就說它支持C11標準。 那麼,現在是否意味着沒有OS,我會實現線程支持?但它可能是怎樣的?遵守C C++標準的責任是什麼?

另一個例子 - 克++爲STM32支持的std ::矢量,它工作,即使沒有OS存儲器管理。 這意味着一些內存管理器是在內部編譯器?或不?

+0

必須總是有某種基礎支持。即使沒有操作系統,圖書館中可能會有潛在的特定於平臺的代碼來處理內存或簡單的多任務處理。不知道你的編譯器版本(我們不知道)以及你連接什麼軟件或其他支持庫是不可能說什麼的。 –

+0

很可能您正在查看所謂的「獨立」編譯器工具鏈。 C++ 11具有核心語言功能(期望它們在那裏)和庫功能(期望它們是有缺陷的/不存在的)。此外,「內存管理」始終是libc任務。操作系統必須有一些基本的進程模型(即使它只是「內存都是你的」) – sehe

+4

C11線程支持是可選的,實現可能會定義'__STDC_NO_THREADS__'來表示不支持threads.h'。 – ouah

回答

2

所以,現在它的意思是,沒有操作系統,我會實現線程支持???

這意味着指定語言以便多線程程序可以正確寫入,並且在訪問共享數據時具有良好定義的同步;並且完整的託管實現應該提供線程庫。這並不意味着所有的實現都將允許多個線程:這將取決於底層系統的支持。

這意味着一些內存管理器裏面的編譯器?

是,一般的語言運行時包括一個堆管理器。它會被分配一些內存(可以從操作系統中獲得,或者以某種其他系統相關的方式分配,也可以簡單地當程序啓動時作爲一個靜態塊),然後分割成更小的塊來支持程序中的動態分配。

7

有兩種類型的C語言實現的 - 託管實現,它提供了標準庫,並獨立實現,其只需要提供核心語言和標題的最小數量。嵌入式系統的實現通常是獨立的。這在the C11 spec的第4部分中有詳細描述。

更重要的是,有許多可即使在託管執行可以省略的功能。特別是,線程支持是可選的(一個託管實現忽略線程支持必須定義宏__STDC_NO_THREADS__)。這在規範的第6.10.8.3節中有描述。