Dichiarazione dell'array di puntatore volatile in C ++
-
28-10-2019 - |
Domanda
Ho una struttura chiamata Ambigous e all'interno della struttura ho una serie di suggerimenti ad altri ambigeni.
Voglio usare la libreria Osatomic.h, per fare comparazioni.
Tuttavia ho problemi a far giocare bene l'array.
OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue,
void *volatile *__theValue)
è la funzione di confronto e swap.
e dentro la mia struttura che ho
Ambigous * volatile* list;
E la chiamata è
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, local->list[pos]);
Quando provo a CAS
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void * volatile *)local->list[pos]);
Ottengo un cattivo ex_bad_access
Quindi immagino a cosa sto rispondendo sia come dovrei dichiarare la serie di indicatori volatili?
Soluzione
Forse vuoi
bool res = OSAtomicCompareAndSwapPtrBarrier(
current_node, new_node, local->list + pos);
Si noti che l'operazione CAS è fondamentalmente
bool CAS(void* old, void* new_, void* volatile* val) {
/*atomic*/ {
if (old == *val) {
*val = new_;
return true;
} else
return false;
}
}
Se passi a list[pos]
, il terzo argomento sarà di tipo Ambigous*
, e *val
sarà di tipo struct Ambigous
che non può essere paragonato a un puntatore.
Altri suggerimenti
Penso che il tuo problema non sia un problema di tipo: hai frainteso la semantica di OSAtomicCompareAndSwapPtrBarrier()
. Devi dare OSAtomicCompareAndSwapPtrBarrier
Un puntatore alla posizione della memoria con in mano il puntatore che si desidera aggiornare. In questo caso, questa è la posizione di local->list[pos]
- Questo può essere scritto sia come local->list + pos
o forse più preparabilmente &(local->list[pos])
.
Dato che hai a che fare con C ++, non semplice C, quindi avrai bisogno di un cast:
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void*volatile*)&(local->list[pos]));