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
}