Pregunta

Tengo una estructura llamada Ambigous, y dentro de la estructura tengo una variedad de punteros a otros Ambigous.

Quiero usar la biblioteca Osatomic.h para hacer comparaciones.

Sin embargo, tengo problemas para que la matriz juegue bien.

 OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue, 
void *volatile *__theValue)

es la función de comparación y intercambio.

y dentro de mi estructura tengo

 Ambigous * volatile* list;

Y la llamada es

bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, local->list[pos]);

Cuando trato de casar

bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void * volatile *)local->list[pos]);

Tengo un mal exe_bad_access

Así que supongo que lo que estoy respondiendo es cómo debo declarar la variedad de consejos volátiles.

¿Fue útil?

Solución

Quizás quieras

bool res = OSAtomicCompareAndSwapPtrBarrier(
              current_node, new_node, local->list + pos);

Tenga en cuenta que la operación CAS es básicamente

bool CAS(void* old, void* new_, void* volatile* val) {
   /*atomic*/ {
     if (old == *val) {
         *val = new_;
         return true;
     } else
         return false;
   }
}

Si pasas un list[pos], el tercer argumento será de tipo Ambigous*, y *val será de tipo struct Ambigous que no se puede comparar con un puntero.

Otros consejos

Creo que su problema no es un problema de tipo: ha entendido mal la semántica de OSAtomicCompareAndSwapPtrBarrier(). Necesitas dar OSAtomicCompareAndSwapPtrBarrier Un puntero a la ubicación de memoria que contiene el puntero que desea actualizar. En este caso, esa es la ubicación de local->list[pos] - Esto se puede escribir como como local->list + pos O tal vez más preparado &(local->list[pos]).

Ya que estás tratando con C ++, no C en C, por lo que necesitarás un elenco:

bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void*volatile*)&(local->list[pos]));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top