0

Ambigousという構造体があり、その構造体の中に他のAmbigousへのポインターの配列があります。

CompareandSwapsを実行するためにOSAtomic.hライブラリを使用したいと思います。

ただし、アレイを適切に再生するのに問題があります。

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

を渡すlist[pos]と、3番目の引数はタイプ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 に答える