Middle+
Mis on atomaarne operatsioon, millised on nende tüübid ja millal ning kuidas on neid kõige parem kasutada?
sobes.tech AI
Vastus AI-lt
Aatomaarsete operatsioonid on operatsioonid mälu üle, mille täitmine on garanteeritult kas täielikult lõpetatud või üldse mitte alustatud ning neid ei saa katkestada teised konkurentsivõimelised operatsioonid. Need on jagamatud ja riistvaratasemel turvalised.
Go pakett sync/atomic pakub funktsioonide kogumi atomaarsete operatsioonide teostamiseks:
| Funktsioon | Kirjeldus |
|---|---|
AddInt32 |
Atomaarne väärtuse lisamine int32-le. |
AddInt64 |
Atomaarne väärtuse lisamine int64-le. |
AddUint32 |
Atomaarne väärtuse lisamine uint32-le. |
AddUint64 |
Atomaarne väärtuse lisamine uint64-le. |
AddUintptr |
Atomaarne väärtuse lisamine uintptr-le. |
CompareAndSwapInt32 |
Atomaarne võrdlus ja vahetamine (CAS) int32-le. |
CompareAndSwapInt64 |
Atomaarne võrdlus ja vahetamine (CAS) int64-le. |
CompareAndSwapUint32 |
Atomaarne võrdlus ja vahetamine (CAS) uint32-le. |
CompareAndSwapUint64 |
Atomaarne võrdlus ja vahetamine (CAS) uint64-le. |
CompareAndSwapUintptr |
Atomaarne võrdlus ja vahetamine (CAS) uintptr-le. |
CompareAndSwapPointer |
Atomaarne võrdlus ja vahetamine (CAS) unsafe.Pointer-ile. |
LoadInt32 |
Atomaarne int32 väärtuse laadimine. |
LoadInt64 |
Atomaarne int64 väärtuse laadimine. |
LoadUint32 |
Atomaarne uint32 väärtuse laadimine. |
LoadUint64 |
Atomaarne uint64 väärtuse laadimine. |
LoadUintptr |
Atomaarne uintptr väärtuse laadimine. |
LoadPointer |
Atomaarne unsafe.Pointer väärtuse laadimine. |
StoreInt32 |
Atomaarne int32 väärtuse salvestamine. |
StoreInt64 |
Atomaarne int64 väärtuse salvestamine. |
StoreUint32 |
Atomaarne uint32 väärtuse salvestamine. |
StoreUint64 |
Atomaarne uint64 väärtuse salvestamine. |
StoreUintptr |
Atomaarne uintptr väärtuse salvestamine. |
StorePointer |
Atomaarne unsafe.Pointer väärtuse salvestamine. |
SwapInt32 |
Atomaarne int32 väärtuste vahetamine. |
SwapInt64 |
Atomaarne int64 väärtuste vahetamine. |
SwapUint32 |
Atomaarne uint32 väärtuste vahetamine. |
SwapUint64 |
Atomaarne uint64 väärtuste vahetamine. |
SwapUintptr |
Atomaarne uintptr väärtuste vahetamine. |
SwapPointer |
Atomaarne unsafe.Pointer väärtuste vahetamine. |
Atomaarsete operatsioonide kasutamine on kõige parem siis, kui on vaja lihtsat, madala taseme juurdepääsu ühistele muutujatele, sageli loenduritele või lipu märkidele, ilma muteksideta. Need tagavad minimaalsete kuludega ja parema jõudluse võrreldes muteksidega sellistes stsenaariumides.
Näide atomaarse loenduri kasutamisest:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int64
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
// Atomaarne loenduri suurendamine
atomic.AddInt64(&counter, 1)
wg.Done()
}()
}
wg.Wait()
// Atomaarne loenduri väärtuse laadimine
fmt.Println("Lõplik loendur:", atomic.LoadInt64(&counter))
}
Näide CompareAndSwap kasutamisest:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int32 = 10
// Katse vahetada väärtus, kui see on 10, väärtuseks 20
swapped := atomic.CompareAndSwapInt32(&value, 10, 20)
fmt.Println("Vahetatud:", swapped) // Vahetatud: true
fmt.Println("Väärtus:", value) // Väärtus: 20
// Katse vahetada väärtus, kui see on 10, väärtuseks 30
swapped = atomic.CompareAndSwapInt32(&value, 10, 30)
fmt.Println("Vahetatud:", swapped) // Vahetatud: false
fmt.Println("Väärtus:", value) // Väärtus: 20
}