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]);
当我尝试 cas 时,
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void * volatile *)local->list[pos]);
我得到一个错误的 EXE_BAD_ACCESS
所以我想我要回答的是我应该如何声明易失性指针数组?
I have a struct called Ambigous, and inside the struct I have an array of pointers to other Ambigous.
I want to use OSAtomic.h library, to do CompareandSwaps.
However I am having trouble getting the array to play nice.
OSAtomicCompareAndSwapPtrBarrier(void *__oldValue, void *__newValue,
void *volatile *__theValue)
is the compare and swap function.
and inside my struct I have
Ambigous * volatile* list;
and the call is
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, local->list[pos]);
When I try to cas by
bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void * volatile *)local->list[pos]);
I get a bad EXE_BAD_ACCESS
So i guess what i am answering is how should i declare the array of volatile pointers?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
也许您想要
注意,CAS 操作基本上是
如果您传递
list[pos]
,则第三个参数将是Ambigous*
类型,并且*val< /code> 将是 struct Ambigous 类型,无法与指针进行比较。
Perhaps you want
Note that the CAS operation is basically
If you pass a
list[pos]
, the 3rd argument will be of typeAmbigous*
, and*val
will be of typestruct Ambigous
which cannot be compared to a pointer.我认为您的问题不是类型问题 - 您误解了 OSAtomicCompareAndSwapPtrBarrier() 的语义。您需要为 OSAtomicCompareAndSwapPtrBarrier 提供一个指向包含要更新的指针的内存位置的指针。在本例中,这就是
local->list[pos]
的位置 - 可以写为local->list + pos
或更易读的&(本地->list[pos])
。由于您正在处理 C++,而不是普通 C,因此您需要进行强制转换:
I think your problem isn't a type issue - you've misunderstood the semantics of
OSAtomicCompareAndSwapPtrBarrier()
. You need to giveOSAtomicCompareAndSwapPtrBarrier
a pointer to the memory location holding the pointer you want to update. In this case, that's the location oflocal->list[pos]
- this can be written either aslocal->list + pos
or perhaps more readably&(local->list[pos])
.Since you're dealing with C++, not plain C, so you will need a cast: