Sobes.tech
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
}