2010-10-18 45 views

回答

12

我認爲主要的原因是

  • 指定線程行爲到語言需要大量的工作和了解,這沒人可用當年
  • 沒人講好線程API一個偉大的想法的,並且沒有一個現有的庫似乎足夠用作進一步工作的基礎
  • 標準化委員會被其他工作淹沒了(像將STL納入標準庫)
  • 那個標準rd遲到了;花了十餘年的第一個版本出現,有相當多的延誤因「最後一分鐘的變化」(std::auto_ptr,STL),我認爲主要的感覺是最好有一些東西早於隨時恭候一個無限延遲的完美標準;我回想起當時大多數人沒想到會花了這麼長時間的下一個版本,以獲得完成

標準被批准,升壓由圖書館工作組的成員作爲成立圖書館一個測試平臺後,其在std lib中是可取的,但是沒有足夠的時間來做最終版本。在那裏,爲C++添加線程支持所需的大部分工作(即創建一個好的線程庫)已經完成。

+0

我總是喜歡閱讀你的評論和答案。 :) +1,很好的回答 – Default 2010-10-18 14:26:24

+0

@默認:我很受寵。 ':)' – sbi 2010-10-18 14:35:52

0

因爲作者不想強制實施者的特定行爲。

+3

爲什麼「他們」現在想要這樣做?我敢打賭,如果在1994年有一個好的線程提議,我們現在就會有標準化的線程。 – sbi 2010-10-18 14:13:21

+1

我敢打賭,它會和'iostream'一樣受歡迎,並且它會濫用轉換運算符。 – 2010-10-18 17:49:01

+0

@Mike:衷心的':)'爲[「abuse」](http://stackoverflow.com/questions/3626483/need-some-kind-of-operator-c/3626541#3626541)。 – sbi 2010-10-18 18:36:48

-1

因爲它們取決於操作系統。 I.E. unix/linux/macosx使用pthread API,Windows使用自己的API等等等等等等......

它們本來可以被包含到libstdc++中,但是我猜想包含所有當前和未來的線程並不容易功能在一個共同的API。同樣的,DB訪問也不包括在libstdc++之內。

+0

你的意思是每個操作系統都以不同的方式創建它們? – 2010-10-18 13:51:37

+1

他們對待他們的方式不同,他們有不同的功能集。 I.E.,POSIX線程不具有fiberthreads,而Windows線程可以。 – 2010-10-18 13:53:15

+5

那又如何?文件系統也不同,但我們確實有文件流。 – sbi 2010-10-18 14:12:59

0

線程是一個操作系統的東西,所以它們不像編程語言那樣是系統提供的函數庫。例如,POSIX線程可以在C++中使用,但不是真正的「部分」。

+4

儘管他們確實需要語言標準的幫助,這就是爲什麼「C++ 0x」(就像它被稱爲)添加內存模型的原因。線程真的不能純粹作爲一個庫來實現。 – SamB 2010-10-18 14:02:29

+1

如果這是正確的,爲什麼有這麼多其他編程語言線程?我們爲什麼要在下一個C++標準中使用它們? – sbi 2010-10-18 14:12:15

+0

也許我應該澄清,不是OS提供的「庫」,而是更多的「OS提供的服務」,因爲編程語言不知道OS是否支持線程化。 – SubSevn 2010-10-18 15:36:29

12

目前的標準是從1998年開始的。有不同的線程實現,並且在12年後還沒有使用線程的經驗。如果C++有一個標準化的線程庫,它可能會在一些常見的線程實現方面效果不佳,並且很可能在未來很難適應。

現在已經過了十二年了,我們對如何使用線程有了更多的瞭解,而且更廣泛的使用爲標準化創造了更多的興趣,所以即將推出的C++標準(我希望它將在2011年正式發佈)將在庫中的線程部分。

+0

+1 - 這不是一個「線程取決於操作系統」,這是歷史原因 – 2010-10-18 14:08:38

+3

實際上,目前的標準是從1998年開始的(雖然它已經在一年前已經相當固定了),但有一些補充,澄清和從2003年開始修復(TR1)。當時有很多關於線程的知識,甚至有過C++線程庫。只是C++不是公司驅動的,如果沒有人拿起周圍的工作,那麼它就沒有完成。 IIRC,C++ 1x(目前預計明年)的線程工作也不是很早就開始。但最後有幾個人拿起了這項工作,並提出了一些足夠體面的建議作爲討論的基礎。 – sbi 2010-10-18 14:11:00

+6

我不同意15年來我們對線程的知識或如何使用它們增加了很多。所有線程的主要組成部分都在過去15年中並沒有太大變化。現在的區別是,使用線程(多核和多處理器架構是常見的)的能力是比較主流的,因此我們更強調需要對它們進行標準化(並使它們易於用於喬初學者(恕我直言,即不是一個好主意,因爲無論我們試圖保護他多少,喬仍然會受到傷害))。 – 2010-10-18 14:52:55

3

當C++在90年代被標準化時,線程肯定存在。但是,Windows和Posix具有截然不同的線程API。設計一個標準語言庫所需的質量庫,提供所需的所有線程原語,並將其很好地映射到兩個流行的API(以及其他),都需要付出很大的努力。把它包括在最初的標準中需要延遲標準化,可能需要數年,或者包括一個可能存在重大缺陷的規範。

這項工作在過去的十年中已經完成(最初是作爲Boost.Thread庫),並且將作爲標準的下一版本中的標準線程支持庫包括在內,除了語言級別的功能如線程本地存儲。

1

有參與創建一個線程類和C++ 0x中已經在很大程度上解決了這一通過增加線程,互斥和原子庫,但它採取了很多工作,從很多人的很多工作。

Orginazationally,請記住,C++是一個非常大的語言和變化相當緩慢發生,因爲它的語言和代碼和行業依賴於它的量的複雜性;因此,批准修改標準需要很長時間。

另外,線程和同步一般都是OS提供的功能,所以任何添加都需要與常用實現兼容,並且可能不對平臺進行大規模更改(或沒有人能夠實現該標準)。

從技術上講,僅僅添加一個線程API是不夠的,C++也缺少一個有凝聚力的內存模型,即變量如何在線程間進行交互,以及我們如何允許廣泛的內存模型在代碼簡潔(和執行)。我們大多數人都幸運地工作在具有一個非常寬容的內存模型主要是單線程的基於x86的軟件,但其他硬件在那裏,是不是從一個存儲模型的視角和對性能的處罰可以說是相當苛刻的寬容。

圖書館提供原子變量與寬容的默認值,並明確控制地址的內存模型問題。

該庫通過提供同步類提供的用於便攜式線程功能的另一個關鍵部件。

最後被添加了,如果你還沒有閱讀工作組網站上的歷史記錄,這很有趣,但是簡單地替換CreateThread,QueueUserWorkItem或pthread調用是一個線程對象還不夠。線程生存期,狀態管理和線程本地存儲都必須考慮。

所有這些都需要很長時間才能得到正確的結果,正如其他人所說的,大部分時間都在促進相當長的一段時間,以確保重大問題得到貫徹,並且在將其納入新標準之前具有凝聚力。

0

12年前標準委員會面臨的挑戰之一是並行硬件的差異。各種高性能計算體系結構之間的一個關鍵區別特徵是許可並行計算的方式,並且這些許多模型中只有一個與posix線程抽象SMP非常相似。

如果您將這種情況與Fortran語言(專門針對此類硬件)的情況進行比較,您會看到每個供應商都提供了一個Fortran編譯器,它們已擴展爲支持硬件提供的特殊並行計算功能。

通過比較典型的x86/x64白盒計算節點(通常具有多達4個插槽),可以將其轉換爲具有多個nVidia的遊戲PC的單核共享內存的24個核心, AMD GPU的。兩者都能夠提高計算吞吐量,但要充分發揮其中的任何一種都需要非常不同的編程風格。實際上,根據特定算法的確切性質,不同的工作負載在一個體繫結構上比另一個體繫結構上的工作明顯更好。這就是說,12年前,標準委員會很難確定它應該如何解決這些問題。但是,現在答案要簡單得多。除了SMP硬件之外,C++不針對其他任何東西;那些由其他語言和工具鏈(如OpenCL或VHDL)提供服務。

相關問題