5
Git'e float32 değerlerini atomik olarak eklemek için bir işleve ihtiyacım var.Go atomic.AddFloat32()
package atomic
import (
"sync/atomic"
"unsafe"
"math"
)
func AddFloat32(addr *float32, delta float32) (new float32) {
unsafeAddr := (*uint32)(unsafe.Pointer(addr))
for {
oldValue := math.Float32bits(*addr)
new = *addr + delta
newValue := math.Float32bits(new)
if atomic.CompareAndSwapUint32(unsafeAddr, oldValue, newValue) {
return
}
}
}
o (yani gerçekten atom olun) çalışması yapılmalıdır: Bu Bulduğum bazı C koduna göre geldi nedir? Go'da daha iyi/hızlı bir yolu var mı?
@JimB: Eğer, bu başarısız olabilir demek bunu bağlıdır anlamına yaptığınızda hedef mimarlık? Alıntı kod sadece/kol/src/sync/atomic/64bit_arm.go'dan sadece kolda güvenilir mi? –
@ B_old: Üzgünüm, konuyu burada yeterince karıştırmış gibi görünüyor. @ PeterSO'nun örneğinin doğru olduğunu ve float32 değerini doğru şekilde güncelleyeceğini kabul ediyorum. Yaptığım yorum, sadece yarış dedektörü ve şu anda değil de * korumalı okumayı * * addr'den * nasıl * işaretleyebiliyordu. Kodun '-race 'altından geçmesini sağlamak genellikle çok önemlidir ve eğer gelecekte bunu gösterirse, etrafta çalışmak zor değildir. (eski yorumları kaldırdılar ve gerçekten kullanışlı değillerdi) – JimB