-1

いくつかの変数 (int と double) にアクセスする 2 つのスレッド t1 と t2 があり、それらを a、b、c と呼びます。t1 は私のクリティカル パス上にあり、高価な比較交換を介してこれらの変数を増減します。

std::atomic<double> a;
std::atomic<double> b;
std::atomic<double> c;
std::atomic<uint32_t> d;
.
.
.
// Extremely-common, critical path thread t1
d++;
while(!a.compare_and_exchange(expectedVal, newVal);
while(!b.compare_and_exchange(expectedVal, newVal);
while(!c.compare_and_exchange(expectedVal, newVal);

t2 はめったに発生しませんが、発生すると、上記の変数が一緒に追加されます。

// Rare thread, t2
return a + b - c;

現時点では、アトミックを使用しています。99.999% の確率で変数が同じスレッドからインクリメントされ、「まれなスレッド」で変数を非アトミックとして宣言できる方法はありますかa + b - c? " スレッドの書き込みが終了した店舗はありますか?

これにより、まれなスレッドが実行されるまれな状況でのみレイテンシを追加できます。

4

1 に答える 1

1

これが可能かどうかはあなたの質問からはわかりませんが、スレッド間の「通信」をリファクタリングして、共有する状態を減らすことができるかもしれません。

たとえば、a + b - ct1 のみがコンポーネントを個別に更新し、t2 はこの特定の組み合わせのみを読み取るという意味で、それらが を介してのみ「通信」するとします。この場合、ab、およびcを通常の変数として定義し、新しい変数 をcombinationアトミック変数として定義することで、使用するアトミック op を減らすことができます。t1 は通常通りにインクリメントし、単一のアトミック op を使用して update を実行しcombinationます。

于 2015-05-30T12:32:04.413 に答える