2016-07-29 11 views
2

私は以下を読んでいます: "スレッドはライブラリとして実装できません"(http://www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf)、私はその記事の主なアイデアに同意します。しかし、私は疑問を持っています。結局のところ、C++モデル(C++ 11)の前には、スレッド化のネイティブサポートがありませんでした。しかし、Boostはライブラリとしてスレッドを提供することができました。だから、どうしたの?/私が誤解したことは?ライブラリとしての実装スレッド

+2

Pthreadsを使用したCのスレッディングのための「ネイティブ」サポートはありませんでした。このペーパーでは、動作するように見えるスレッドライブラリの例としてこれを使用していますが、Pthreads仕様ではレースが禁止されています。他のスレッドがそれを変更している間に共有変数を更新します。 問題は、レースが存在するかどうかは、 プログラミング言語のセマンティクスによって決まります。 では、正しく定義されたメモリモデルが必要です。 **この定義は循環**です。 'スレッドライブラリが存在し、実際には動作しましたが、それはハックです。 –

+3

_スレッドは実装できません**効率的かつ正確に**ライブラリとして。 Boost :: Threadは、記事で概説されている多くの点に苦しんでいました。関連性:http://stackoverflow.com/questions/6319146/c11-introduced-a-standardized-memory-model-what-does-it-mean-and-how-is-it-g –

+0

"Pthreadsの仕様では、競合他のスレッドがそれを変更している間に共有変数にアクセスします。 "うわー、どうやって動くの?結局、ミューテックスを取ることは一種のレースだよね? – Gilgamesz

答えて

3

その情報はまだ関連していますが、そのペーパーは少し古くなっています。それ以来、C++ 11はこれらの問題に対処するためのいくつかの更新を導入しました。特に、C++ 11では、マルチスレッドプログラムを扱うために、より明確に定義されたメモリモデルが追加されました。これは、この論文で説明されているJavaに似ています。 C++ 11はまた、 "シーケンシング"と呼ばれるsequence pointsのコンセプトを固め、独自のスレッドライブラリ(boostのものに基づく)を追加し、ロックフリーアルゴリズムを扱うためのいくつかの機能を含むアトミックライブラリを追加します。

したがって、C++委員会は、マルチスレッド環境での動作に関してC++言語の仕様を改善しました。また、最小限のメモリモデルの期待値を明確に定義しています。

これは完璧ではありませんが、私たちは私たちよりはるかに良い場所にあります。私が推薦する

情報:

  • アンソニー・ウィリアムズの本: "アクションにはC++の同時実行"
  • ハーブサッターの "Atomic Weapons" 会談。
+1

シーケンスポイントはC++ 11では新しくありません。あなたが与えたリンクによれば、C++ 11は実際には前後の不確定性( 'foo(i ++、i ++)'のような)、または順序付けされていない(非原子データ競合がこのカテゴリに入る)という概念で置き換えました。しかし、キーポイントは正しいです:C++ 11は、マルチスレッドのC++抽象マシンで意味をなさないようにシーケンシングの定義を変更しました。 –

+0

@Peter Cordesあなたの修正に基づいて編集されました。 – ChrisG0x20

2

ブーストスレッドは、基盤となるOS(Win32スレッドまたはPOSIXスレッド)によって提供されるネイティブスレッドのラッパーとして機能します。

また、コンパイラを書く人々は、正常に動作するためには、標準自体で必要とされる以上の動作を定義しなければならないという事実にも依存していました。

残念ながら、Boostスレッドがどれくらいの処理能力を持っていたのか(スレッドローカルストレージのようなものを制御するためのマクロはかなりありますが、かなりの数の施設への半携帯アクセスが可能です)。

関連する問題