Объявление Массива Указателей Volatile в C++

У меня есть структура под названием Ambigous, и внутри структуры у меня есть массив указателей на другие Ambigous.

Я хочу использовать библиотеку OSAtomic.h, чтобы сделать CompareandSwaps.

Однако у меня проблемы с получением массива для хорошей игры.

 OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue, 
void *volatile *__theValue)

это функция сравнения и обмена.

и внутри моей структуры у меня есть

 Ambigous * volatile* list;

и вызов

bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, local->list[pos]);

Когда я пытаюсь

bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void * volatile *)local->list[pos]);

Я получаю плохую EXE_BAD_ACCESS

Итак, я думаю, что я отвечаю, как я должен объявить массив изменчивых указателей?

2 ответа

Решение

Возможно, вы хотите

bool res = OSAtomicCompareAndSwapPtrBarrier(
              current_node, new_node, local->list + pos);

Обратите внимание, что операция CAS в основном

bool CAS(void* old, void* new_, void* volatile* val) {
   /*atomic*/ {
     if (old == *val) {
         *val = new_;
         return true;
     } else
         return false;
   }
}

Если вы передаете list[pos]третий аргумент будет иметь тип Ambigous*, а также *val будет иметь тип struct Ambigous который нельзя сравнить с указателем.

Я думаю, что ваша проблема не является проблемой типа - вы неправильно поняли семантику OSAtomicCompareAndSwapPtrBarrier(), Вам нужно дать OSAtomicCompareAndSwapPtrBarrier указатель на область памяти, содержащую указатель, который вы хотите обновить. В данном случае это местоположение local->list[pos] - это можно записать как local->list + pos или, возможно, более читабельно &(local->list[pos]),

Поскольку вы имеете дело с C++, а не с простым C, вам понадобится приведение:

bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void*volatile*)&(local->list[pos]));
Другие вопросы по тегам