Déclaration du tableau de pointeurs volatils en C ++
-
28-10-2019 - |
Question
J'ai une structure appelée Ambigous, et à l'intérieur de la structure j'ai un tableau de pointeurs vers d'autres Ambigous.
Je veux utiliser la bibliothèque OSAtomic.h, pour faire CompareandSwaps.
Cependant, j'ai du mal à faire fonctionner le tableau.
OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue,
void *volatile *__theValue)
est la fonction de comparaison et d'échange.
et dans ma structure j'ai
Ambigous * volatile* list;
et l'appel est
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, local->list[pos]);
Quand j'essaye de faire un cas par
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void * volatile *)local->list[pos]);
J'ai un mauvais EXE_BAD_ACCESS
Donc, je suppose que je réponds: comment dois-je déclarer le tableau de pointeurs volatils?
La solution
Peut-être que vous voulez
bool res = OSAtomicCompareAndSwapPtrBarrier(
current_node, new_node, local->list + pos);
Notez que l'opération CAS est essentiellement
bool CAS(void* old, void* new_, void* volatile* val) {
/*atomic*/ {
if (old == *val) {
*val = new_;
return true;
} else
return false;
}
}
Si vous passez un list[pos]
, le 3ème argument sera de type Ambigous*
, et *val
sera de type struct Ambigous
qui ne peut pas être comparé à un pointeur.
Autres conseils
Je pense que votre problème n'est pas un problème de type - vous avez mal compris la sémantique de OSAtomicCompareAndSwapPtrBarrier()
.Vous devez donner à OSAtomicCompareAndSwapPtrBarrier
un pointeur vers l'emplacement mémoire contenant le pointeur que vous souhaitez mettre à jour.Dans ce cas, c'est l'emplacement de local->list[pos]
- cela peut être écrit soit comme local->list + pos
ou peut-être plus facilement &(local->list[pos])
.
Puisque vous avez affaire au C ++, pas au C pur, vous aurez donc besoin d'un cast:
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void*volatile*)&(local->list[pos]));