12

C++ 11にはスレッドの概念がいくつかあります。たとえば、新しい記憶域指定子thread_localを定義し、この記憶域指定子を持つ変数には「スレッドごとに異なるオブジェクトまたは参照があります」[basic.stc.thread]と指定します。C++ 11は「スレッド」とは何を考えていますか?

この目的のために「スレッド」とは何でしょうか?標準スレッドライブラリ(つまりstd::threadオブジェクトで表されるスレッド)を使用して作成されたスレッドのみですか?他の手段で作成されたスレッドについてはどうでしょうか(たとえば、Linuxで直接pthreadを使うなど)?ユーザー空間スレッドを提供するライブラリを使用する場合、それぞれがthread_localオブジェクトの独自のコピーを取得しますか(実際にどのように実装できるかはわかりません)。

答えが「thread_localのような目的のためにスレッドと見なされる実装定義」の場合、よく知られた実装でこれを定義する方法の例を挙げることができますか?

+0

@texasbruce Java * now *にキーワードがありますか?彼らは17年前にそこにいました。 – EJP

答えて

3

スレッドサポートライブラリのコンポーネントは、これらの引用符のためにカウントされます。標準状態は、独自の実行スレッドで実行されます。main

表にまとめたよう

1以下の節は、リンクに

、作成および管理 スレッド(1.10)を、相互排除を実行し、スレッド間の条件および値を通信するために構成要素を説明1.10は、スレッドが話されていることを意味します。

1実行のスレッド(スレッドまたとして知られている)初期など、プログラム内の単一の制御フローである...

従ってそれは私にスレッドだのみ参照stdlibスレッド(std :: threadと、スレッドサポートライブラリが内部で行うことを意味します)に渡します。もちろんthread_localは多くの場合、ネイティブスレッドで作業することになります(特に、特定のシステムでは、スレッドを実装するための選択肢は複数ありません)が、標準では保証できないことがわかります。

+0

これは当てはまりますが、実装は 'std :: thread'だけで' thread_local'をサポートすることで技術的に逃げることができますが、これは品質の低い実装です。これまでの実装では、 'thread_local'がシステムスレッドで動作することを保証しており、' std :: thread'がシステムスレッドライブラリサポートを通じて 'thread_local'をサポートするようになっています。 – bames53

+1

@ bames53これは私の答えにどのように当てはまるのか、私が言っているのは、C++の「スレッド」は内部的に実装されているもので、 'std :: thread'は明らかにそれらの1つですが、 「スレッド」。実装が内部的にpthreadsを使用していても、それらが "スレッド"として機能するようになっても、標準ではこのIMOの保証が分かります。 – aaronman

+0

はい、標準では 'std :: thread'以外の何も保証していないことに同意します。私はそれを実際に追加しています。私が 'thread_local'を知っている実装では、' std :: thread'だけでなく、システムのスレッドでも動作します。 – bames53

0

標準では、他のライブラリやシステムコールによって生成されたスレッドの動作については説明していません。彼らは、基準に関しては、その行動において未定義である。 C++では、複数のスレッドを作成する方法はありません。そのようなライブラリやシステムコールは、C++標準で標準化されていないことを行います。

このようなライブラリとシステムコールは、それぞれ独自の仕様で定義された方法で動作します。多くの場合、C++ std::threadは、そのようなライブラリやシステムコールの上に構築されることさえあります。相互作用がどのくらい正確に機能するかは指定されていません。

3

C++ 11§1.10/ 1用語の定義:実行の

スレッド(スレッドもとしても知られる)初期など、プログラム内の単一の制御フローであります特定のトップレベル関数の呼び出し、およびスレッドによってその後に実行されるすべての関数呼び出しを再帰的に含みます。[注: 1つのスレッドが別のスレッドを作成すると、新しいスレッドのトップレベル関数への最初の呼び出しは、新しいスレッドによって実行され、スレッドの作成では実行されません。 - 最終ノート

イタリック体の付いた用語は、これが決定的であることを示します。各関数の呼び出しは新しいスレッドを定義するので、この定義は数学的に不十分だと主張することもできますが、それは間違いです。それらは、制御の単一の流れを意味し、さもなければ、非規範的な注釈は、規範的な「再帰的に含む」テキストの効果を取り消すであろう。

コア言語の観点からは、std::threadがこのようなことを引き起こすのは単に付随的なことです。

ユーザスペーススレッドを提供するライブラリを使用すると、それぞれがthread_localオブジェクトの独自のコピーを取得しますか(その実装方法は実際にはわかりません)。

カーネルコールなしでこのようなライブラリを書く方法はありません。おそらく、プロセス内のすべてのスレッドは、カーネルを満たすために、pthreadsのような高水準の抽象化ですでに表現されています。 C++の標準ライブラリは、ネイティブのスレッドライブラリに対して書かれているため、追加の接着剤を使わなくても「うまく動作します」。

たとえば、新しいスレッドの開始時ではなく、最初のアクセス時にオブジェクトが初期化されるため、コンパイラはアクセスしておそらく初期化するためにpthread_selfに基づいてクエリを挿入するだけです。初期化では、pthread_cleanupファシリティを持つデストラクタが登録されます。

ここで定義されている実装は、既存のネイティブライブラリがC++と互換性があるかどうかです。彼らがそれを提供し、それが顧客が望む傾向があると仮定すると、それの上に構築された他のすべてのスレッドライブラリは自動的に互換性があり、他の競合を排除します。

+0

OPの質問に実際に答えるためには、プログラム内で新しい制御の流れを作り出すものは、標準で 'thread_local'のようなもので動作することが保証されています – aaronman

+0

@aaronmanうん。明確にするために別のメモを追加します... – Potatoswatter

関連する問題