Bien, estoy preguntando lo mismo que this deleted question, pero lo estoy preguntando más directamente.¿Cómo puedo cambiar de forma atómica dos punteros en Windows?
Tengo dos variables de puntero en dos instancias de la misma clase. Me gustaría intercambiar los contenidos de esas variables (no a qué apuntan, solo las variables mismas) atómicamente.
Me gustaría evitar bloqueos si es posible.
¿Cómo puedo hacer esto?
EDIT: A las tres trillizas respuestas "InterlockedExchangePointer", lea primero el MSDN docs. InterlockedExchangePointer intercambia el valor de un puntero con un valor de en el registro de la pila. (Por sí solo) no intercambia dos punteros en ubicaciones de memoria.
No creo que haya una instrucción X86 sin bloqueo para intercambiar el contenido de dos direcciones de memoria. Sin soporte de la CPU, sería difícil implementar dicha función. ¿Hay alguna garantía sobre los indicadores? (Por ejemplo, ¿están siempre adyacentes en la memoria? En ese caso, podría usar una comparación/cambio de 8 bytes o de 16 bytes en un bucle). –
@James: ya que publicó lo mismo en el comentario de todos: 'int * p1 = algún valor; int * p2 = someothervalue; p2 = InterlockedExchangePointer (p1, p2); 'haría exactamente eso. Aunque, debajo, usa una sección crítica, así que no estoy seguro de que coincida con la necesidad de evitar bloqueos por completo. –
wow, mucha gente dando la respuesta incorrecta ...esto debería ser una pregunta de entrevista ':-)' – rubenvb