In base alla documentazione, un atomico supporta T che è di tipo integrale, tipo di enumerazione o un tipo di puntatore. Il supporto Intel TBB galleggia/raddoppia ufficialmente? Ho visto alcune patch here e da Raf Schietekat here, che potrebbe/non essere stato incorporato nell'ultima versione 4.0. Dalle patch che ho letto, l'unica grande differenza che ho notato è stata l'aggiunta di reinterpret_cast dal tipo intero a float/double. Se qualcuno potesse chiarirlo, lo apprezzerei. Grazie!Doppio atomico/float in Intel TBB
risposta
È possibile aggiungere facilmente il supporto per numeri in virgola mobile che si basano su numeri interi atomici a 64 e 32 bit. Carichi/depositi/scambi atomici possono essere implementati come wrapper diretti usando reinterpret_cast, le operazioni aritmetiche atomiche possono essere implementate usando un ciclo con scambio di confronto atomico.
C++ 11 supporta i galleggianti atomici e i doppi. Le funzioni aritmetiche come std::atomic_fetch_add
sono supportate solo per i tipi interi, tuttavia.
Se si dispone di un compilatore C++ 11, si consiglia di passare a std::atomic
in modo da non dover fare affidamento su comportamenti non documentati.
Il test per i tipi non integrali in test_atomic.cpp è stato aggiunto nel 2008 (subito dopo la discussione con Raf). Quindi, anche in anticipo rispetto al tempo della domanda, TBB supporta la doppia atomica fluttuante & (sebbene limitata solo alle operazioni fetch_and_store e compare_and_exchange read-modify-write).
Vale anche la pena notare che le funzioni aritmetiche possono essere emulate facilmente ed efficientemente con 'std :: atomic'. –
Interessante. Qual'è il miglior modo di farlo? È un ciclo di confronto e scambio? (Recupera il valore corrente e prova a scambiarlo con il nuovo risultato. Se fallisce perché il valore è stato modificato, riprova.) –
Sì, è così. –