5

検討:

class Vector
{
  double x, y, z;
  // …
};

class Object
{
  Vector Vec1, Vec2;
  std::mutex Mtx1, Mtx2;

  void ModifyVec1() { std::lock_guard Lock(Mtx1); /* … */ }
  void ModifyVec2() { std::lock_guard Lock(Mtx2); /* … */ }
};

ミューテックスまたは保護された変数のいずれかが連続して格納され、キャッシュ時にキャッシュ ラインを共有する場合、一種の「クロスロック」が発生する可能性がありますか?

もしそうなら、ミューテックスが保護する変数の直後 (または前) にミューテックスを宣言するのは良い習慣ですか?

クラスをstd::hardware_destructive_interference_size( P0154 ) に揃えると、この影響を回避できる場合があります。オブジェクトをオーバーアラインメントする価値がある潜在的な利点はありますか?

4

1 に答える 1

4

hardware_destructive_interference_sizeあなたの変数はあなたの質問では無関係に見えるので、おそらくあなたが望むのではなくhardware_constructive_interference_size:

struct keep_together {
    std::mutex m;
    Vector v;
};

alignas(std::hardware_constructive_interference_size) keep_together k1;
alignas(std::hardware_constructive_interference_size) keep_together k2;

destructiveatomicスレッドが 2 つの異なる を読み込んでいて、両方が実際にロードされることを確認したい場合など、ロックフリー キューのような場合に使用します。それが問題である場合は、偽の共有を避けている理由を説明する必要があります。

同じキャッシュラインにある可能性を高めるために、保護する変数の直後 (または前) にミューテックスを宣言することは良い習慣ですか?

それがconstructive干渉です。

于 2016-09-16T11:39:46.373 に答える