1
4

3 に答える 3

4

ポインターではなく、full2 と full3 の値を渡す必要があります。また、アライメントにも注意が必要です。

__sync_bool_compare_and_swap((long long*)full,*(long long*)full2,*(long long*)full3);

(もちろん、これは移植性がありません。移植性が必要な場合は、uint64_t代わりに使用しますlong long)

于 2012-02-13T00:30:30.657 に答える
3

ポインタの参照を解除してキャストするのを忘れたようです。

私はテストしましたが、これが正しい唯一の組み合わせです。

__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バイトの任意の整数スカラーまたはポインター型を許可します。

したがって、この関数を使用してそのケースを処理することはできないように思われます。

于 2012-02-13T00:33:00.613 に答える
2

char *に aを渡してい__sync_bool_compare_and_swapます。char 配列 (3 つすべて!) が 64 ビットに適切に配置されていると仮定すると (表示されている方法で割り当てられている場合は、そうではない可能性があります。使用してください!)、に渡す前に にmallocキャストしてみてください。それができない場合は、インラインアセンブラを使用して直接呼び出します。(long long *)__sync_bool_compare_and_swapCMPXCHG8B

于 2012-02-13T00:30:27.617 に答える