la asignación de referencia es atómica, entonces ¿por qué se necesita Interlocked.Exchange (ref Object, Object)?
En mi servicio web multiproceso asmx tuve un campo de clase _todosData de mi propio tipo SystemData que consta de pocosList<T>
yDictionary<T>
marcado comovolatile
. Los datos del sistema (_allData
) se actualiza de vez en cuando y lo hago creando otro objeto llamadonewData
y llenar sus estructuras de datos con nuevos datos. Cuando termine, solo asigno
private static volatile SystemData _allData
public static bool LoadAllSystemData()
{
SystemData newData = new SystemData();
/* fill newData with up-to-date data*/
...
_allData = newData.
}
Esto debería funcionar ya que la asignación es atómica y los hilos que tienen la referencia a datos antiguos siguen usándola y el resto tiene los nuevos datos del sistema justo después de la asignación. Sin embargo, mi colega dijo que en lugar de usarvolatile
palabra clave y asignación simple que debo usarInterLocked.Exchange
porque dijo que en algunas plataformas no se garantiza que la asignación de referencia sea atómica. Además: cuando declarothe _allData
campo comovolatile
el
Interlocked.Exchange<SystemData>(ref _allData, newData);
produce advertencia "una referencia a un campo volátil no se tratará como volátil" ¿Qué debo pensar al respecto?