3 に答える
ポインターではなく、full2 と full3 の値を渡す必要があります。また、アライメントにも注意が必要です。
__sync_bool_compare_and_swap((long long*)full,*(long long*)full2,*(long long*)full3);
(もちろん、これは移植性がありません。移植性が必要な場合は、uint64_t
代わりに使用しますlong long
)
ポインタの参照を解除してキャストするのを忘れたようです。
私はテストしましたが、これが正しい唯一の組み合わせです。
__sync_bool_compare_and_swap((long long*)full, *(long long *)full2, *(long long *)full3);
最初のパラメータをキャストする必要があります。そうしないと、最初の文字のみがスワップされます。
128ビットの倍長の処理に関しては、これはgcc4.1.2docsからのものです。
Intelのドキュメントに記載されている定義では、int型、long型、long型、およびそれらの符号なしの対応する型のみを使用できます。GCCは、長さが1、2、4、または8バイトの任意の整数スカラーまたはポインター型を許可します。
したがって、この関数を使用してそのケースを処理することはできないように思われます。
char *
に aを渡してい__sync_bool_compare_and_swap
ます。char 配列 (3 つすべて!) が 64 ビットに適切に配置されていると仮定すると (表示されている方法で割り当てられている場合は、そうではない可能性があります。使用してください!)、に渡す前に にmalloc
キャストしてみてください。それができない場合は、インラインアセンブラを使用して直接呼び出します。(long long *)
__sync_bool_compare_and_swap
CMPXCHG8B