2

2 つのスレッドがあり、1 つが TSX トランザクションを作成し、データ構造を変更するとします。もう一方のスレッドは、いかなる種類の同期も行わず、同じデータ構造を読み取ります。トランザクションはアトミックですか?トランザクションによって変更されたキャッシュラインを読み取ろうとすると、ブロックまたは再起動する方法がないため、実際にはそれが真実であるとは想像できません。

トランザクションがアトミックでない場合でも、x86 の書き込み順序規則は尊重されますか? 書き込み #2 を認識した場合、前の書き込み #1 を認識できなければならないことが保証されます。これは、トランザクションの一部として発生する書き込みにも当てはまりますか?

これらの質問に対する答えはどこにも見つかりませんでした.SOの誰もが知っているとは思えませんが、少なくとも誰かがこれが答えを出すのにGoogleフレンドリーな場所であることを知ったとき.

4

1 に答える 1

3

(私の回答は、Intel® 64 and IA-32 Architectures Optimization Reference Manualの第 12 章に基づいています)

トランザクションは読み取りに対してアトミックであり、読み取りによってトランザクションが中止され、トランザクションが実行されなかったかのように見えます。トランザクション領域では、キャッシュ ライン (L1 で追跡) の読み取りが読み取りセットと見なされ、書き込みセットから書き込まれたラインと見なされます。別のプロセッサが書き込みセット (あなたの例) から読み取るか、読み取りセットまたは書き込みセットのいずれかに書き込む場合、データの競合が発生します。

データの競合は、キャッシュ コヒーレンス プロトコルを通じて検出されます。データの競合により、トランザクションが中止されます。最初の実装では、データの競合を検出したスレッドはトランザクションを中止します。

したがって、トランザクションを試行しているスレッドは行を追跡しており、他のスレッドが読み取り要求を行ったときに競合を検出します。それは中止され、「ハードウェアは XBEGIN 命令の操作によって提供される命令アドレスで再起動します」。この章では、2 番目のプロセッサが何をしているかについての区別はありません。トランザクションを試行しているか、単純な読み取りを実行しているかは問題ではありません。

要約すると、すべてのスレッド (トランザクションかどうかに関係なく) は、完全なトランザクションを参照するか、何も参照しません。TSX トランザクション内のスレッドのみが、メモリの中間状態を確認できます。

于 2014-03-23T17:03:35.763 に答える