質問

私は曖昧な構造体を持っています、そして、構造体の内部には、他の曖昧なものへのポインターの配列があります。

osatomic.hライブラリを使用して、比較とdswapsを行いたいと思います。

しかし、私は配列をうまく再生するのに苦労しています。

 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が得られます

それで、私が答えているのは、揮発性のポインターの配列をどのように宣言すればよいかということだと思います。

役に立ちましたか?

解決

おそらくあなたは望んでいます

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 ポインターと比較することはできません。

他のヒント

あなたの問題はタイプの問題ではないと思います - あなたはの意味論を誤解しました 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]));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top