C ++における揮発性ポインターアレイの宣言
-
28-10-2019 - |
質問
私は曖昧な構造体を持っています、そして、構造体の内部には、他の曖昧なものへのポインターの配列があります。
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]));
所属していません StackOverflow