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?

È stato utile?

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]));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top