0

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

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

4

2 回答 2

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;
   }
}

如果您传递 a list[pos],则第三个参数将是 type Ambigous*,并且*val将是struct Ambigous无法与指针进行比较的类型。

于 2011-03-22T19:12:43.687 回答
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]));
于 2011-03-22T19:14:15.720 回答