2010-11-23 2 views
1

Tout le monde sait ce que gcc fait avec les expressions passées comme valeur pour les builtins atomiques. Considérez la fonction ci-dessous. Gcc va-t-il garantir l'atomicité de cette opération? (Même si les cycles supplémentaires sont nécessaires pour calculer 2 << nr?Expressions dans les opérateurs atomiques gcc

static inline test_and_set_bit(volatile void *addr, int nr, int set) { 
    __sync_fetch_and_or(addr, set ? 2 << nr : 0); 
} 

Merci!

Répondre

2

L'expression set ? 2 << nr : 0 doit être évaluée avant l'opération __sync_fetch_and_or() est lancée. Ainsi, la lecture-ou l'accès à addr sera atomique Pour être clair - les actions de lecture/modification/écriture dans la mémoire pointée par addr se produiront de manière atomique - l'évaluation de la valeur à insérer ne sera pas atomique (mais elle ne le fait pas). pas besoin d'être)

+0

Donc d'abord l'expression sera évaluée, puis l'opération atomique? C'est ce que je pensais qu'il allait se passer, mais il est bon d'avoir une confirmation. Merci! –

1

Votre fonction sera équivalente à cette fonction (ils vont probablement même compiler le même code):

static inline test_and_set_bit(volatile void *addr, int nr, int set) { 
    const int bit = set ? 2 << nr : 0; 
    __sync_fetch_and_or(addr, bit); 
} 

L'expression ne sera pas evaulated « atomiquement », mais comme il implique toutes les variables locales qui est non pertinent. Le __sync_fetch_and_or sera exécuté atomiquement. Vous pourriez vouloir changer votre fonction pour ressembler à celle-ci afin que les gens qui viennent après vous ne soient pas confus.

Questions connexes