2016-11-09 3 views
2

cの場合はa = bをアトミックに割り当てる必要があり、条件が成立しない場合は割り当てません。 C/C++でこれを行う方法はありますか?条件がC/C++で保持されている場合は、アトミックに値を設定する方法はありますか?

明確化:私は、「アトミックに割り当てる」よりも、原子的に「テストして割り当てる」ことを意味しました。

+5

CまたはC++?それらは非常に異なる言語です!特にアトミックの場合。 –

+0

条件 'c'は' a'の現在の値に依存しますか? ( 'compare-and-swap'タグがついているので質問してください) – Thomas

+0

" atomic "を定義してください。どんな状況下で? – tadman

答えて

7

一般的に必要な操作を実行する操作は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(またはその他の複数の操作メカニズム)を使用する必要があります。

1

cは、それ自体がaの一部のプロパティである場合、アトミック操作を比較することで問題を解決できます。コメントには、これは当てはまりません。

c(状態を読み取ったり状態を変更するもの)、aのすべてのアクセスを共通のstd::mutexのロック内にラップしてください。

テストcaに割り当てられているのは、std::mutexです。

これに失敗した場合は、シングルスレッドプログラムを作成します。

OSレベルのAPIを使用して、プロセス内の自分以外のすべてのスレッドを中断してから、cをテストし、おそらくaに割り当てます。これは、半分書かれた(すなわち、非結合状態の)状態のcまたはaを見ることができ、スレッドサスペンションプランでは、実際には避けるための実際的な方法がない傾向があることに注意してください。caロックフリー原子そのものです。

この計画は非常に危険で壊れやすいことに注意してください。

問題が解決しない場合は、問題を抽象的なほど詳しく説明せずに、別の質問をしてください。オッズはあなたの問題のあまり抽象的なバージョンではないソリューションが合理的です。

関連する問題