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?

Était-ce utile?

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]));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top