Atomik operatsiyalar nima, ularning turlari qanday va ularni qachon va qanday yaxshiroq ishlatish mumkin?
sobes.tech AI
AIdan javob
Atomar operatsiyalar — bu xotira ustida bajariladigan operatsiyalar bo‘lib, ularning bajarilishi yoki to‘liq yakunlanadi, yoki umuman boshlanmaydi, va ular boshqa raqobatlashayotgan operatsiyalar tomonidan to‘xtatilmaydi. Ular bo‘linmas va apparat darajasida ip xavfsizdir.
Go tilida sync/atomic paketi atomar operatsiyalarni bajarish uchun funksiyalar to‘plamini taqdim etadi:
| Funksiya | Tavsifi |
|---|---|
AddInt32 |
int32 ga atomar qo‘shish |
AddInt64 |
int64 ga atomar qo‘shish |
AddUint32 |
uint32 ga atomar qo‘shish |
AddUint64 |
uint64 ga atomar qo‘shish |
AddUintptr |
uintptr ga atomar qo‘shish |
CompareAndSwapInt32 |
int32 uchun atomar solishtirish va almashtirish (CAS) |
CompareAndSwapInt64 |
int64 uchun atomar solishtirish va almashtirish (CAS) |
CompareAndSwapUint32 |
uint32 uchun atomar solishtirish va almashtirish (CAS) |
CompareAndSwapUint64 |
uint64 uchun atomar solishtirish va almashtirish (CAS) |
CompareAndSwapUintptr |
uintptr uchun atomar solishtirish va almashtirish (CAS) |
CompareAndSwapPointer |
unsafe.Pointer uchun atomar solishtirish va almashtirish (CAS) |
LoadInt32 |
int32 qiymatini atomar yuklash |
LoadInt64 |
int64 qiymatini atomar yuklash |
LoadUint32 |
uint32 qiymatini atomar yuklash |
LoadUint64 |
uint64 qiymatini atomar yuklash |
LoadUintptr |
uintptr qiymatini atomar yuklash |
LoadPointer |
unsafe.Pointer qiymatini atomar yuklash |
StoreInt32 |
int32 qiymatini atomar saqlash |
StoreInt64 |
int64 qiymatini atomar saqlash |
StoreUint32 |
uint32 qiymatini atomar saqlash |
StoreUint64 |
uint64 qiymatini atomar saqlash |
StoreUintptr |
uintptr qiymatini atomar saqlash |
StorePointer |
unsafe.Pointer qiymatini atomar saqlash |
SwapInt32 |
int32 qiymatini atomar almashtirish |
SwapInt64 |
int64 qiymatini atomar almashtirish |
SwapUint32 |
uint32 qiymatini atomar almashtirish |
SwapUint64 |
uint64 qiymatini atomar almashtirish |
SwapUintptr |
uintptr qiymatini atomar almashtirish |
SwapPointer |
unsafe.Pointer qiymatini atomar almashtirish |
Atomar operatsiyalarni ishlatish eng yaxshi holatda, umumiy o‘zgaruvchilarga, odatda hisoblagichlar yoki flaglar uchun, mueytseksiz, past darajadagi sinxronizatsiya talab qilinadigan hollarda tavsiya etiladi. Ular minimal qo‘shimcha xarajatlar va mueytseksiz holatlarda yaxshiroq ishlashni ta’minlaydi.
Atomar hisoblagich misoli:
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() {
// Atomar tarzda hisoblagichni oshiramiz
atomic.AddInt64(&counter, 1)
wg.Done()
}()
}
wg.Wait()
// Atomar tarzda hisoblagich qiymatini yuklaymiz
fmt.Println("Final Counter:", atomic.LoadInt64(&counter))
}
CompareAndSwap dan foydalanish misoli:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int32 = 10
// Agar hozirgi qiymat 10 bo‘lsa, uni 20 ga almashtirishga urinish
swapped := atomic.CompareAndSwapInt32(&value, 10, 20)
fmt.Println("Swapped:", swapped) // Swapped: true
fmt.Println("Value:", value) // Value: 20
// Agar hozirgi qiymat 10 bo‘lsa, uni 30 ga almashtirishga urinish
swapped = atomic.CompareAndSwapInt32(&value, 10, 30)
fmt.Println("Swapped:", swapped) // Swapped: false
fmt.Println("Value:", value) // Value: 20
}
Muhim: atomar operatsiyalar faqat primitiv turlar bilan ishlaydi (butun sonlar, ko‘rsatkichlar). Murakkabroq ma’lumot tuzilmalariga kirishni sinxronlashtirish yoki blokirovka qiluvchi operatsiyalar uchun hali ham mueytsekslar yoki boshqa sinxronizatsiya mexanizmlari talab etiladi. Haddan tashqari yoki noto‘g‘ri atomar operatsiyalarni ishlatish qiyin aniqlanadigan xatoliklar yoki ishlashning pasayishiga olib kelishi mumkin.