c
の場合はa = b
をアトミックに割り当てる必要があり、条件が成立しない場合は割り当てません。 C/C++でこれを行う方法はありますか?条件がC/C++で保持されている場合は、アトミックに値を設定する方法はありますか?
明確化:私は、「アトミックに割り当てる」よりも、原子的に「テストして割り当てる」ことを意味しました。
c
の場合はa = b
をアトミックに割り当てる必要があり、条件が成立しない場合は割り当てません。 C/C++でこれを行う方法はありますか?条件がC/C++で保持されている場合は、アトミックに値を設定する方法はありますか?
明確化:私は、「アトミックに割り当てる」よりも、原子的に「テストして割り当てる」ことを意味しました。
一般的に必要な操作を実行する操作は1つではありません。あなたの条件がc
の場合、a
が既に特定の値に設定されている場合は、がである場合があります。ここで
std::atomic<int> value;
...
int expected = 9;
bool result = std::atomic_compare_exchange_strong(&value, &expected, 10);
value
は10が条件value == 9
が成立した場合にのみ、全体の操作がアトミックであることに設定されています。この場合は、必要な操作は、例えば比較交換は、あります。
条件がこのフォームを使用しない場合は、アトミック性を実現するためにmutex(またはその他の複数の操作メカニズム)を使用する必要があります。
c
は、それ自体がa
の一部のプロパティである場合、アトミック操作を比較することで問題を解決できます。コメントには、これは当てはまりません。
c
(状態を読み取ったり状態を変更するもの)、a
のすべてのアクセスを共通のstd::mutex
のロック内にラップしてください。
テストc
a
に割り当てられているのは、std::mutex
です。
これに失敗した場合は、シングルスレッドプログラムを作成します。
OSレベルのAPIを使用して、プロセス内の自分以外のすべてのスレッドを中断してから、c
をテストし、おそらくa
に割り当てます。これは、半分書かれた(すなわち、非結合状態の)状態のc
またはa
を見ることができ、スレッドサスペンションプランでは、実際には避けるための実際的な方法がない傾向があることに注意してください。c
とa
ロックフリー原子そのものです。
この計画は非常に危険で壊れやすいことに注意してください。
問題が解決しない場合は、問題を抽象的なほど詳しく説明せずに、別の質問をしてください。オッズはあなたの問題のあまり抽象的なバージョンではないソリューションが合理的です。
CまたはC++?それらは非常に異なる言語です!特にアトミックの場合。 –
条件 'c'は' a'の現在の値に依存しますか? ( 'compare-and-swap'タグがついているので質問してください) – Thomas
" atomic "を定義してください。どんな状況下で? – tadman