Ho trovato questo codice per compareAndSwap
in a StackOverflow answer:Come posso implementare un puntatore portatile confrontare e scambiare?
boolean CompareAndSwapPointer(volatile * void * ptr,
void * new_value,
void * old_value) {
#if defined(_MSC_VER)
if (InterlockedCompareExchange(ptr, new_value, old_value) == old_value) return false;
else return true;
#elif (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100
return __sync_bool_compare_and_swap(ptr, old_value, new_value);
#else
# error No implementation
#endif
}
È questo il modo più corretto di avere codice veloce portatile, (tranne assemblaggio inline).
Inoltre, un problema è che questi specifici metodi builtin
hanno parametri diversi e valori di ritorno da un compilatore a un altro, il che potrebbe richiedere alcune modifiche aggiuntive come lo if then else
in questo esempio.
Un altro problema potrebbe essere il comportamento di questi metodi builtin
a livello di codice macchina, si comportano esattamente nello stesso modo? (Per esempio utilizzano le stesse istruzioni di montaggio)
Nota: altro problema sarebbe se c'è molte piattaforme supportate non solo (Windows
e Linux
) come in questo esempio. Il codice potrebbe diventare molto grande.
_ "È questo il modo più corretto per avere un codice veloce portatile, (eccetto l'inlining di assemblaggio)." _ L'assemblaggio in linea sarebbe estremamente _non_-portable. – Michael
'std :: atomico' :-) –
C o C++? Sceglierne uno. –