我有一个名为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]);
当我尝试cas by
时bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void * volatile *)local->list[pos]);
我的EXE_BAD_ACCESS错误
所以我想我要回答的是我应该如何声明易失性指针数组?
答案 0 :(得分:3)
也许你想要
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
,无法与指针进行比较。< / p>
答案 1 :(得分:1)
我认为你的问题不是类型问题 - 你误解了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]));