Linux x86_64 と clang 3.3 を使用しています。
これは理論上でも可能ですか?
std::atomic<__int128_t>
動作しません (一部の関数への未定義の参照)。
__atomic_add_fetch
も機能しません (「エラー: このアトミック ライブラリ呼び出しはまだコンパイルできません」)。
と の両方が 64 ビットの数値で動作しますstd::atomic
。__atomic_add_fetch
Linux x86_64 と clang 3.3 を使用しています。
これは理論上でも可能ですか?
std::atomic<__int128_t>
動作しません (一部の関数への未定義の参照)。
__atomic_add_fetch
も機能しません (「エラー: このアトミック ライブラリ呼び出しはまだコンパイルできません」)。
と の両方が 64 ビットの数値で動作しますstd::atomic
。__atomic_add_fetch
それは不可能です。1 つの命令で 128 ビットの加算を行う x86-64 命令はありません。また、アトミックに何かを行うには、基本的な出発点は単一の命令であるということです (それでもアトミックではない命令がいくつかありますが、それは別件)。
128 ビット数の周りに他のロックを使用する必要があります。
編集:次のようなものを使用するものを考え出すことができる可能性があります:
__volatile__ __asm__(
" mov %0, %%rax\n"
" mov %0+4, %%rdx\n"
" mov %1,%%rbx\n"
" mov %1+4,%%rcx\n"
"1:\n
" add %%rax, %%rbx\n"
" adc %%rdx, %%rcx\n"
" lock;cmpxcchg16b %0\n"
" jnz 1b\n"
: "=0"
: "0"(&arg1), "1"(&arg2));
これは私がハッキングしたばかりで、コンパイルはしていません。しかし、原則は、比較が等しくなるまで繰り返すということです。
Edit2: タイピングが遅すぎます。Cory Nelson が同じことを投稿しましたが、組み込み関数を使用しています。
Edit3:ループを更新して、読み取りを必要としない不要な読み取りメモリを削除します... CMPXCHG16B がそれを行います。