Parfois, vous pouvez vouloir accéder à une variable à la fois atomiquement et non atomiquement. Quelle est la raison pour laquelle je trouve convinient que sur gcc vous pouvez écrire quelque chose comme:C11 mélange accès atomique et non-atomique à la variable
int var = 0;
var++;
atomic_fetch_add(&var, 1);
Toutefois, cela ne compile pas avec clang 4.0.1:
error: address argument to atomic operation must be a pointer to _Atomic type ('int *' invalid)
atomic_fetch_add(&var, 1);
La meilleure solution que je pourrais trouver est un casting:
int var = 0;
(*(int*)&var)++;
atomic_fetch_add(&var, 1);
Existe-t-il un moyen plus simple et portable d'y parvenir?
"ceci ne compile pas avec clang" --- un message d'erreur serait utile. – zerkms
Btw, quel est le but initial de faire cela? Le premier changement de valeur n'est pas garanti pour être vu par un autre thread, donc la valeur 'var ++;' peut être effectivement pas du tout appliquée. – zerkms
Comment * cela * pourrait-il fonctionner? '_Atomic int' et' int' sont des types différents, donc les pointeurs ne seront pas convertis automatiquement. Si vous lancez manuellement, vous obtenez un comportement indéfini pour l'accès à un objet via une expression lvalue qui ne correspond pas au type effectif de l'objet (et non à un type de caractère). – EOF