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

发布于 2024-10-25 21:39:19 字数 692 浏览 1 评论 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]);

当我尝试 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

何必那么矫情 2024-11-01 21:39:19

也许您想要

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< /code> 将是 struct Ambigous 类型,无法与指针进行比较。

Perhaps you want

bool res = OSAtomicCompareAndSwapPtrBarrier(
              current_node, new_node, local->list + pos);

Note that the CAS operation is basically

bool CAS(void* old, void* new_, void* volatile* val) {
   /*atomic*/ {
     if (old == *val) {
         *val = new_;
         return true;
     } else
         return false;
   }
}

If you pass a list[pos], the 3rd argument will be of type Ambigous*, and *val will be of type struct Ambigous which cannot be compared to a pointer.

謸气贵蔟 2024-11-01 21:39:19

我认为您的问题不是类型问题 - 您误解了 OSAtomicCompareAndSwapPtrBarrier() 的语义。您需要为 OSAtomicCompareAndSwapPtrBarrier 提供一个指向包含要更新的指针的内存位置的指针。在本例中,这就是 local->list[pos] 的位置 - 可以写为 local->list + pos 或更易读的 &(本地->list[pos])

由于您正在处理 C++,而不是普通 C,因此您需要进行强制转换:

bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void*volatile*)&(local->list[pos]));

I think your problem isn't a type issue - you've misunderstood the semantics of OSAtomicCompareAndSwapPtrBarrier(). You need to give OSAtomicCompareAndSwapPtrBarrier a pointer to the memory location holding the pointer you want to update. In this case, that's the location of local->list[pos] - this can be written either as local->list + pos or perhaps more readably &(local->list[pos]).

Since you're dealing with C++, not plain C, so you will need a cast:

bool res=OSAtomicCompareAndSwapPtrBarrier(current_node, new_node, (void*volatile*)&(local->list[pos]));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文