Объявление Массива Указателей Volatile в C ++ - PullRequest
0 голосов
/ 22 марта 2011

У меня есть структура, называемая 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 ]

3 голосов
/ 22 марта 2011

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

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, который нельзя сравнить с указателем.

1 голос
/ 22 марта 2011

Я думаю, что ваша проблема не относится к типу - вы неправильно поняли семантику 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]));
...