2017-08-29 1 views
-1

x64でC++マルチスレッドを使用しています。私はデータバスをよりよく理解したいと思います。私はガードなしで2つのスレッドから変数を設定しようとすると(mutex、CV、セマフォー、アトミックな)変数を設定しようとするとどうなるのか理解したい。データバスに依存するもの。例えば 私が持っている場合、変数:データバスに応じてガードなしで複数のスレッドから変数を設定する

int32_t i; 

Iは、異なるスレッド内の変数に設定した場合: スレッド1:

i =0x11223344; 

スレッド2:私は、x64のデータについて知っているよう

i =0x44332211; 

バスは64ビットです。変数iは1命令で設定できます。私はそれがコンパイラに依存することを知っている。私はキャッシュも影響力があることを知っています。データバス(キャッシュなし)とのやり取りだけを知りたい。私の質問は、データバスの幅(8,16,32ビット)に依存する動作です。 の値は何ですか?

+2

何も分かりません。現在のC++標準を構成する1400+ページには、「データバス」と呼ばれるものは何も言及されていません。 –

+0

C++はこれが未定義の動作だと言っているので、その質問に答えるのには役立ちません。プログラムをアセンブリにコンパイルし、そのアセンブリ命令がどのようなコードを実行するのかを調べる必要があります(コンパイラのフラグなどによって明らかに変わります)。あなたは少なくとも答えが可能なようにアセンブリコードを掲示するべきです。 – nwp

+0

私の質問は、セットが1つの命令に含まれている場合、両方ともアトミックになります。 –

答えて

1

不幸な答えは、あなたの質問に明確な答えがないということです。

ここで、C++から一歩踏み出そう。あなたがしたいことは、非同期の同時書き込みを実行することです。このような操作の結果が何であるかに関して、あなたが与えることができる保証は、多くの要因によって大きく異なります。もちろん、ターゲットアーキテクチャは大きな役割を果たします。 x86のような強力なメモリモデルを持つマシンは、PowerPCやARMマシンよりももっと寛大であるかもしれません。しかし、ここで終わらない。あなたが実行しているマシン上の特定のメモリ構成(NUMAアーキテクチャと思う)のように、アライメントは重要な役割を果たす可能性があります。だから、すべての答えに適合するワンサイズはありません。それはすべて状況に非常に微妙に依存しており、状況が正確に分かっていても、しばしば残されている答えは次のようなものです。つまり、どちらの同時書き込み操作でも書き込まれなかった値)が、ハードウェアがどのように構築されたのかがわかります。

このため、このような高いレベルでこの問題について議論するのは意味がありません。 x86に関しては、命令セットアーキテクチャによって保証されるものがいくつかあります。 the manualの関連セクションをご自由に閲覧してください。しかし、スレッド非認識メモリアクセスを使用している場合は、より高いレベルの言語からそれらの保証にアクセスする方法がありません。動作は未定義であるため、コンパイラは生成されたコードを任意の方法で混乱させる可能性のある任意の数の最適化を実行できますが、コードで表現したものとは一貫しています。あなたのコードは同時性を意識していないので(非同期アクセスを使用しているので、定義通り)、コンパイラはこれを行うためのあらゆる権利を持っています。

唯一の方法は、ロックやアトミックなどの適切な同期を使用することです。それらは、言語レベル(特定のコンパイラの最適化を禁止する)と、(生成されたマシンコードに必要な同期命令を挿入することによって)これらの保証がハードウェアまで確実に行われることを保証します。高水準言語からハードウェアを構成するシリコンまで、この一連の保証があれば、適切なマルチスレッドプログラミングを行うことができます。チェーンから単一のリンクを削除すると、すべてが崩壊します。

+0

はい、あなたは高いレベルの方に適しています。私は、その値が2つの値の1つであるべきか、または(0x11222211)のようなバイトミックスでなければならないと考えていました。そのような質問は、アセンブリレベルで質問する方が良いかもしれません。私の質問は単純な好奇心のためでした。詳細をありがとう。私はマニュアルから露の事を読むでしょう。 –

+0

@Vladimir - x64では、正しく整列された整数値は常に一度にすべて書き込まれるため、 "混在"することはありません。しかし、それが 'atomic 'でない限り、メモリに書き込まれるという実際の保証はありません。また、コンパイラは、ハードウェア機能を利用して、同じ命令を使用して、「通常」の値と同じように書き込みアトミック値を読み取ることができます。それは、それが適切な時に行われることを保証することだけである。 –

関連する問題