Atomik əməliyyatlar nədir, onların növləri hansılardır və nə zaman və necə daha yaxşı istifadə etmək olar?
sobes.tech Süni İntellekt
AI-dan cavab
Atomik əməliyyatlar yaddaş üzərində həyata keçirilən əməliyyatlardır və onların icrası ya tamamilə tamamlanır, ya da heç başlamır və digər rəqabət edən əməliyyatlar tərəfindən kəsilə bilməzlər. Onlar bölünməz və hardware səviyyəsində təhlükəsizdirlər.
Go dilində sync/atomic paketi atomik əməliyyatları həyata keçirmək üçün funksiyalar toplusu təqdim edir:
| Funksiya | Təsviri |
|---|---|
AddInt32 |
int32-yə atomik şəkildə dəyər əlavə edir. |
AddInt64 |
int64-yə atomik şəkildə dəyər əlavə edir. |
AddUint32 |
uint32-yə atomik şəkildə dəyər əlavə edir. |
AddUint64 |
uint64-yə atomik şəkildə dəyər əlavə edir. |
AddUintptr |
uintptr-yə atomik şəkildə dəyər əlavə edir. |
CompareAndSwapInt32 |
int32 üçün atomik müqayisə və dəyişdirmə (CAS). |
CompareAndSwapInt64 |
int64 üçün atomik müqayisə və dəyişdirmə (CAS). |
CompareAndSwapUint32 |
uint32 üçün atomik müqayisə və dəyişdirmə (CAS). |
CompareAndSwapUint64 |
uint64 üçün atomik müqayisə və dəyişdirmə (CAS). |
CompareAndSwapUintptr |
uintptr üçün atomik müqayisə və dəyişdirmə (CAS). |
CompareAndSwapPointer |
unsafe.Pointer üçün atomik müqayisə və dəyişdirmə (CAS). |
LoadInt32 |
int32 dəyərini atomik şəkildə yükləyir. |
LoadInt64 |
int64 dəyərini atomik şəkildə yükləyir. |
LoadUint32 |
uint32 dəyərini atomik şəkildə yükləyir. |
LoadUint64 |
uint64 dəyərini atomik şəkildə yükləyir. |
LoadUintptr |
uintptr dəyərini atomik şəkildə yükləyir. |
LoadPointer |
unsafe.Pointer dəyərini atomik şəkildə yükləyir. |
StoreInt32 |
int32 dəyərini atomik şəkildə saxlayır. |
StoreInt64 |
int64 dəyərini atomik şəkildə saxlayır. |
StoreUint32 |
uint32 dəyərini atomik şəkildə saxlayır. |
StoreUint64 |
uint64 dəyərini atomik şəkildə saxlayır. |
StoreUintptr |
uintptr dəyərini atomik şəkildə saxlayır. |
StorePointer |
unsafe.Pointer dəyərini atomik şəkildə saxlayır. |
SwapInt32 |
int32 dəyərini atomik şəkildə dəyişir. |
SwapInt64 |
int64 dəyərini atomik şəkildə dəyişir. |
SwapUint32 |
uint32 dəyərini atomik şəkildə dəyişir. |
SwapUint64 |
uint64 dəyərini atomik şəkildə dəyişir. |
SwapUintptr |
uintptr dəyərini atomik şəkildə dəyişir. |
SwapPointer |
unsafe.Pointer dəyərini atomik şəkildə dəyişir. |
Atomik əməliyyatların istifadəsi, ümumi dəyişənlərə, adətən sayğaclara və ya bayraqlara, mutexlərdən istifadə etmədən, sadə və aşağı səviyyəli sinxronizasiya tələb olunduğu hallarda ən yaxşı tövsiyə olunur. Bu əməliyyatlar minimal əlavə xərclər və bu cür ssenarilərdə daha yaxşı performans təmin edir.
Atomik sayğac nümunəsi:
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() {
// Sayğacı atomik şəkildə artırırıq
atomic.AddInt64(&counter, 1)
wg.Done()
}()
}
wg.Wait()
// Sayğacın dəyərini atomik şəkildə yükləyirik
fmt.Println("Final Counter:", atomic.LoadInt64(&counter))
}
CompareAndSwap istifadə nümunəsi:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int32 = 10
// Əgər hazırki dəyər 10-dursa, onu 20-ə dəyişməyə cəhd edin
swapped := atomic.CompareAndSwapInt32(&value, 10, 20)
fmt.Println("Swapped:", swapped) // Swapped: true
fmt.Println("Value:", value) // Value: 20
// Əgər hazırki dəyər 10-dursa, onu 30-ə dəyişməyə cəhd edin
swapped = atomic.CompareAndSwapInt32(&value, 10, 30)
fmt.Println("Swapped:", swapped) // Swapped: false
fmt.Println("Value:", value) // Value: 20
}
Qeyd etmək lazımdır ki, atomik əməliyyatlar yalnız primitiv tiplərlə işləyir (tam ədədlər, göstəricilər). Daha mürəkkəb məlumat strukturlarına və ya bloklama əməliyyatlarına sinxronizasiya üçün hələ də mutexlər və ya digər sinxronizasiya mexanizmləri tələb olunur. Atomik əməliyyatların həddindən artıq və ya yanlış istifadəsi çətin aşkarlanan səhvlərə və ya performansın azalmasına səbəb ola bilər.