5

C++ 11 で 2 つのアトミック変数をアトミックに比較するために使用できる比較演算子を探しています。ここでは、これらのアトミック obj に格納されている値を交換したくないので、compare_and_swap 関数には関心がありません。以下の例を参照してください。

std::atomic<uint32_t> readIdx{0};
std::atomic<uint32_t> writeIdx{0};

while(writeIdx + 1 == readIdx)   <<<<------------------
{
     std::this_thread::yield();
}

私が望むのは、矢印線で表されるコードをアトミ​​ックにすることです。出来ますか?そうでない場合writeIdx == readIdx、アトミック操作ですか?

4

1 に答える 1

5

意味がないので、それは不可能です。

コードは比較のために有効な値を取得しますが、それらの値がいつ取得されるかについての保証はほとんどありません。したがって、チェックが成功した場合、ある時点で得られreadIdxた値と等しい時点であったことがわかります。writeIdx + 1この 2 つの時点は、ほとんど無関係です。特に、ある時点で の値が の値とreadIdx等しくwriteIdx + 1なくても、チェックが成功することは許されます。

これが実際には問題にならない理由は次のとおりです。追加のロックを導入しないと、両方のアトミックが同時に等しいという概念を確立することはできません。問題は、その条件に依存するコードはすべて、チェックを実行する同じアトミック実行ブロックの一部である必要があることです。そうでない場合、コードの実行が完了する前に条件が変わる可能性があります。

一方、コードのどの部分も条件に依存しない場合、そもそもそれを概念として導入しても意味がありません。

したがって、続行する方法は次のとおりです。戻って、コードの実行時に両方の変数が期待される値を持たなければならないという条件に依存するコードが本当にあるかどうかを再評価します。その場合は、そのコードをロックで保護する必要があります。そうでない場合は、現在のコードで提供されている保証が弱すぎて実際に使用できない可能性があるため、条件をまったくチェックする必要がない可能性があります。

于 2013-11-12T12:52:45.497 に答える