2012-01-10 10 views
2

インタビューで特定のスレッド内のauto/global変数が表示されますか?スレッドは同じアドレス空間を使用するため、表示 しかし、私は各スレッドは、それが表示されるべきではない独自のコントロールブロックがあると思います。特定のスレッド内のauto/global変数が他のスレッドから見える

あなたの取り組みは?

+0

どの言語ですか? –

+0

そのC言語。 –

答えて

2

[編集:おっと、私はCの代わりにC++のために答えてきた。しかしC11はC++ 11に多少似ています。それはまた、「スレッドの保存期間」があり、それはまた、私が説明し、両方の意味で「目に見える」使用しています以下。だから、答えは両者でほぼ同じです。 C(++)11の規格に先立ち、POSIXと他のスレッドモデルは、年間のスレッドローカルストレージを持つグローバルを持っていた。]

[*]「可視」を定義します。

メモリを使用すると、オブジェクトのアドレスを持っているならば、あなたは別のスレッドからアクセスできるという意味で、「可視」です。データ競合を作成すると、未定義の動作が発生する可能性があります。静的記憶寿命

グローバルグローバルの名前はすべてのスレッドで同じオブジェクトを指すという意味でも「可視」です。糸貯蔵期間を持つ

グローバルスレッドごとに別々のオブジェクトがあり、名前は、コードが実行されたスレッドに属するオブジェクトを指します。したがって、それらは名前によって異なるスレッドに「可視」ではありませんが、あるスレッドから別のスレッドにアドレスを渡すことにした場合、オブジェクト自体にはまだアクセスできます。

自動変数は、同じスレッドの名前でも、定義されているスコープ以外のスコープから「表示」されません。自動変数の名前は、現在の呼び出しに対して作成されたオブジェクトを参照します関数の関数が再帰的である場合、スレッドごとに複数のそのような呼び出しがあり、それぞれには同じ名前の自動変数のセットがあります。関数が異なるスレッドから同時に呼び出された場合、同様にそれぞれ独自の自動変数があります。したがって、名前は異なるスレッドから「可視」ではありません。ここでもオブジェクト自体にアクセスできます。

[*] C++ 11標準では、1.10ではメモリが見えるという意味で "visible"という言葉が使用されています。異なるスレッド/スコープの単一オブジェクトを参照する名前の意味ではありません。しかしそれは正式に言葉を定義していません。また、3.3.2/2のスコープ内にある名前の意味で「可視」を使用し、これまでに見つけた少なくとも2つの他のコンテキストでは「可視」を使用します。

+0

、P6:間接オブジェクトが関連付けられているもの以外の スレッドからの自動記憶域期間を持つオブジェクトにアクセスしようとするの 結果は実装定義であります*。 – this

0

問題のスレッドが同じプロセスに属している(またはプロセッサ/ OSが保護されたプロセスメモリ管理を提供していない)場合は、はいとなります。

+0

しかし、独自のスタックとauto変数を持つ各スレッドはスタックに格納されますので、このように見れば答えはNOになります。 –

+1

各スレッドには独自のスタックとレジスタがありますが、すべてのスレッドのスタックは共有アドレス空間に表示されます。 1つのスレッドがスタックにオブジェクトを割り当て、そのスレッドのアドレスを別のスレッドに送信すると、そのオブジェクトには同じアクセス権が与えられます。 * 6.2.4 –

関連する問題