C ++中的易失性指针数组声明

时间:2011-03-22 19:04:14

标签: c++ xcode atomic-swap

我有一个名为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错误

所以我想我要回答的是我应该如何声明易失性指针数组?

2 个答案:

答案 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]));