¿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_dwConnectTimeuego 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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta