ARMでアトミックな変数操作をしたくてググっていたら、こちらに辿り着いた。
ほうほう。LDREX, STREXなんて命令があって、アトミックに操作できるよう自分以外を止めるのではなく、アトミックに操作できなかったらリトライするのか。普通はアトミックに操作できない方が確率的にレアだろうから、失敗した時しかやり直さないこの方法は良い性能が出そうだな。
…なんて思いながら読んでいたら、GCCには__sync_fetch_and_add()みたいな組み込み関数があるとのこと。ちょっと使ってみたら
.L3:しっかりLDREX, STREXを吐いてくれた。ついでにx86でも試してみたら、lockプレフィックスを付けてくれていた。GCC限定だけど、こりゃいいわ。
ldrex r1, [r3]
add r1, r1, #1
strex r2, r1, [r3]
cmp r2, #0
bne .L3
0 件のコメント:
コメントを投稿