Sobes.tech
Middle+

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.