Declaración de matriz de puntero volátil en C ++
-
28-10-2019 - |
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.
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]));