A atribuição de referência é atômica, por que o Interlocked.Exchange (ref Object, Object) é necessário?
No meu serviço da web asmx multithread, eu tinha um campo de classe _allData do meu próprio tipo SystemData que consiste em poucosList<T>
eDictionary<T>
marcado comovolatile
. Os dados do sistema (_allData
) é atualizada de vez em quando e eu faço isso criando outro objeto chamadonewData
e preencha suas estruturas de dados com novos dados. Quando terminar, eu apenas atribuo
private static volatile SystemData _allData
public static bool LoadAllSystemData()
{
SystemData newData = new SystemData();
/* fill newData with up-to-date data*/
...
_allData = newData.
}
Isso deve funcionar, pois a atribuição é atômica e os threads que têm referência a dados antigos continuam a usá-lo e o restante possui os novos dados do sistema logo após a atribuição. No entanto, meu colega disse que, em vez de usarvolatile
palavra-chave e atribuição simples que devo usarInterLocked.Exchange
porque ele disse que em algumas plataformas não é garantido que a atribuição de referência seja atômica. Além disso: quando eu declarothe _allData
campo comovolatile
a
Interlocked.Exchange<SystemData>(ref _allData, newData);
produz aviso "uma referência a um campo volátil não será tratada como volátil" O que devo pensar sobre isso?