Sobes.tech
Middle+

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.