変数にアトミックまたは非アトミックにアクセスすることがあります。C11変数へのアトミックおよび非アトミックなアクセスを混在させる
int var = 0;
var++;
atomic_fetch_add(&var, 1);
しかし、これが打ち鳴らす4.0.1でコンパイルされません:
error: address argument to atomic operation must be a pointer to _Atomic type ('int *' invalid)
atomic_fetch_add(&var, 1);
私は見つけることができる最善の解決策はキャストである:私はgccの上のあなたのような何かを書くことができることにconvinient見つける理由であります
int var = 0;
(*(int*)&var)++;
atomic_fetch_add(&var, 1);
これを達成するためのより簡単でポータブルな方法はありますか?
"これはclangでコンパイルされません" ---エラーメッセージが参考になります。 – zerkms
Btw、それをやることの本来の目的は何ですか?最初の値の変更は他のスレッドでは保証されないので、 'var ++;'の値は効果的に適用されません。 – zerkms
これはどのように*できますか? '_Atomic int'と' int'は異なる型なので、それらへのポインタは自動的に変換されません。手動でキャストすると、オブジェクトの有効な型ではなく(文字型ではない)左辺式を使用してオブジェクトへのアクセスに対して未定義の動作が発生します。 – EOF