Sobes.tech
Middle+

ატომური ოპერაციები რა არის, რა ტიპები არსებობს და როდის და როგორ არის უკეთესი მათ გამოყენება?

sobes.tech AI

პასუხი AI-სგან

Атомар операцияләр — бу хәтер өстендә башкарылган операцияләр, аларның үтәлеше тулысынча тәмамлану яки башланмау белән гарантияләнә һәм башка конкурирующие операцияләр белән өзелмиләр. Алар аппарат дәрәҗәсендә бүленмәс һәм потокка куркынычсыз.

Go пакетында sync/atomic атомар операцияләрне башкару өчен функцияләр җыелмасы тәкъдим ителә:

Функция Тасвирлама
AddInt32 int32 га атомар рәвештә сан өстәү.
AddInt64 int64 га атомар рәвештә сан өстәү.
AddUint32 uint32 га атомар рәвештә сан өстәү.
AddUint64 uint64 га атомар рәвештә сан өстәү.
AddUintptr uintptr га атомар рәвештә сан өстәү.
CompareAndSwapInt32 int32 өчен чагыштыру һәм алыштыру (CAS).
CompareAndSwapInt64 int64 өчен чагыштыру һәм алыштыру (CAS).
CompareAndSwapUint32 uint32 өчен чагыштыру һәм алыштыру (CAS).
CompareAndSwapUint64 uint64 өчен чагыштыру һәм алыштыру (CAS).
CompareAndSwapUintptr uintptr өчен чагыштыру һәм алыштыру (CAS).
CompareAndSwapPointer unsafe.Pointer өчен чагыштыру һәм алыштыру (CAS).
LoadInt32 int32 бәясен атомар рәвештә йөкләү.
LoadInt64 int64 бәясен атомар рәвештә йөкләү.
LoadUint32 uint32 бәясен атомар рәвештә йөкләү.
LoadUint64 uint64 бәясен атомар рәвештә йөкләү.
LoadUintptr uintptr бәясен атомар рәвештә йөкләү.
LoadPointer unsafe.Pointer бәясен атомар рәвештә йөкләү.
StoreInt32 int32 бәясен атомар рәвештә саклау.
StoreInt64 int64 бәясен атомар рәвештә саклау.
StoreUint32 uint32 бәясен атомар рәвештә саклау.
StoreUint64 uint64 бәясен атомар рәвештә саклау.
StoreUintptr uintptr бәясен атомар рәвештә саклау.
StorePointer unsafe.Pointer бәясен атомар рәвештә саклау.
SwapInt32 int32 бәяләрен атомар рәвештә алыштыру.
SwapInt64 int64 бәяләрен атомар рәвештә алыштыру.
SwapUint32 uint32 бәяләрен атомар рәвештә алыштыру.
SwapUint64 uint64 бәяләрен атомар рәвештә алыштыру.
SwapUintptr uintptr бәяләрен атомар рәвештә алыштыру.
SwapPointer unsafe.Pointer бәяләрен атомар рәвештә алыштыру.

Атомар операцияләрне куллану иң яхшы, әгәр гади, түбән дәрәҗәдәге синхронлаштыру кирәк булганда, гадәттә санагычлар яки флаглар өчен, мьютексларсыз. Алар минималь чыгымнар белән яхшы җитештерүчәнлекне тәэмин итәләр.

Атомар санагычның мисалы:

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() {
			// Атомар рәвештә санагычны арттыру
			atomic.AddInt64(&counter, 1)
			wg.Done()
		}()
	}

	wg.Wait()
	// Атомар рәвештә санагычның бәясен алу
	fmt.Println("Final Counter:", atomic.LoadInt64(&counter))
}

CompareAndSwap куллану мисалы:

package main

import (
	"fmt"
	"sync/atomic"
)

func main() {
	var value int32 = 10

	// Әгәр хәзерге бәсе 10 булса, алыштыру 20га
	swapped := atomic.CompareAndSwapInt32(&value, 10, 20)
	fmt.Println("Swapped:", swapped) // Swapped: true
	fmt.Println("Value:", value)   // Value: 20

	// Әгәр хәзерге бәсе 10 булса, алыштыру 30га
	swapped = atomic.CompareAndSwapInt32(&value, 10, 30)
	fmt.Println("Swapped:", swapped) // Swapped: false
	fmt.Println("Value:", value)   // Value: 20
}