¿Uso incorrecto de InterlockedCompareExchange para copiar un valor atómicamente?
No puedo usar C ++ 11 atomics aquí
Tengo dudas sobre mi uso deInterlockedCompareExchange()
para leer 'atómicamente' una variable.
Hice una pregunta sobre estaaqu, pero lo que estaba haciendo allí era diferente. Los parámetros de "intercambio" y "competidor" (2º y 3º) eran valores 'codificados', es decir, no leídos de una variable.
Por favor considere esto:
// Copy the connect time
DWORD dwConnectTime = InterlockedCompareExchange(&msgInfo.m_dwConnectTime,
msgInfo.m_dwConnectTime,
msgInfo.m_dwConnectTime);
Esto está destinado a intercambiar el valor demsgInfo.m_dwConnectTime
con el valor actual demsgInfo.m_dwConnectTime
, siempre que el valor actual demsgInfo.m_dwConnectTime
esmsgInfo.m_dwConnectTime
. El valor anterior demsgInfo.m_dwConnectTime
uego se devuelve @,que es en lo que confío para 'copiar' el valor.
Me acabo de dar cuenta de que las lecturas demsgInfo.m_dwConnectTime
para el segundo y el tercer parámetro no se garantiza que sean atómicos. Por lo tanto, este código es incorrecto, por lo tanto, necesito usar una primitiva de bloqueo para copiarmsgInfo.m_dwConnectTime
?