Estoy buscando un equivalente de LWARX y STWCX (como se encuentra en los procesadores PowerPC) o una forma de implementar una funcionalidad similar en la plataforma x86. Además, ¿dónde sería el mejor lugar para averiguar sobre tales cosas (es decir, buenos artículos/sitios web/foros para la programación de bloqueo/espera).x86 equivalente para LWARX y STWCX
Editar
Creo que podría necesitar dar más detalles a medida que se supone que sólo estoy en busca de un CAS (comparar y swap) operación. Lo que intento hacer es implementar un sistema de conteo de referencias sin candado con punteros inteligentes a los que se pueda acceder y cambiar por medio de varios hilos. Básicamente necesito una forma de implementar la siguiente función en un procesador x86.
int* IncrementAndRetrieve(int **ptr) { int val; int *pval; do { // fetch the pointer to the value pval = *ptr; // if its NULL, then just return NULL, the smart pointer // will then become NULL as well if(pval == NULL) return NULL; // Grab the reference count val = lwarx(pval); // make sure the pointer we grabbed the value from // is still the same one referred to by 'ptr' if(pval != *ptr) continue; // Increment the reference count via 'stwcx' if any other threads // have done anything that could potentially break then it should // fail and try again } while(!stwcx(pval, val + 1)); return pval; }
Realmente necesito algo que imita LWARX y STWCX con bastante precisión para sacar esto adelante (no puedo encontrar una manera de hacer esto con el CompareExchange, intercambio o añadir funciones que he encontrado hasta ahora para el x86).
Gracias
DCAS casi parece correcto, excepto que Necesito cambiar 1 palabra solo si un puntero a esa palabra no cambia mientras hago esto (eso es un poco confuso, con suerte la actualización de la pregunta ayuda a aclarar esto). –
Logré encontrar una solución usando DCAS, no es infalible, ya que usa una ID única (4 bytes de tamaño) pero las posibilidades de que se rompa son escasas porque tanto el UID de 4 bytes como el contador de 4 bytes contiguo deben ser replicado exactamente. Esto es solo un problema si algo borra el objeto reasigna la memoria a otra cosa y luego logra duplicar esos 8 bytes mientras que otro hilo intenta copiar un puntero, que es una operación relativamente corta (en lo que respecta a la operación, la longitud es solo larga) suficiente si el hilo se interrumpe) –
No conozco el PPC en particular, pero en la mayoría de las máquinas, las instrucciones de carga exclusiva/almacenamiento condicional no ayudan realmente con el problema de ABA porque las operaciones de memoria se realizan entre una carga exclusiva y store-conditional puede ocasionar que la operación condicional de la tienda falle espontáneamente. Si uno vuelve a leer la ubicación protegida y ve que ha cambiado, se puede decir que otra cosa lo escribió con un nuevo valor, pero si tiene el mismo valor que en la lectura anterior, no habrá forma de distinguir una falla espontánea de una ABA escribe. – supercat