Объявление Массива Указателей 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]));