Sobes.tech
Middle+

Ի՞նչ են ագրեգատային օպերացիաները, ինչ տեսակներ կան և երբ և ինչպես լավագույնս օգտագործել:

sobes.tech AI

Պատասխան AI-ից

Ատոմարային օպերացիաները՝ դա հիշողության վրա կատարվող օպերացիաներն են, որոնց կատարման երաշխիք կա, որ կամ ամբողջությամբ ավարտվում են կամ ընդհանրապես չեն սկսվում, և դրանք չեն կարող խզվել այլ մրցակցող օպերացիաներով։ Դրանք անբաժանելի և հարթակային մակարդակում անվտանգ են։

Go փաթեթը sync/atomic տրամադրում է ֆունկցիաների հավաքածու՝ ագրեգատորային օպերացիաների կատարման համար՝

Ֆունկցիա Նկարագրություն
AddInt32 Ատոմարապես ավելացնում է արժեքը int32-ին։
AddInt64 Ատոմարապես ավելացնում է արժեքը int64-ին։
AddUint32 Ատոմարապես ավելացնում է արժեքը uint32-ին։
AddUint64 Ատոմարապես ավելացնում է արժեքը uint64-ին։
AddUintptr Ատոմարապես ավելացնում է արժեքը uintptr-ին։
CompareAndSwapInt32 Ատոմարապես համեմատում և փոխում է int32-ը։
CompareAndSwapInt64 Ատոմարապես համեմատում և փոխում է int64-ը։
CompareAndSwapUint32 Ատոմարապես համեմատում և փոխում է uint32-ը։
CompareAndSwapUint64 Ատոմարապես համեմատում և փոխում է uint64-ը։
CompareAndSwapUintptr Ատոմարապես համեմատում և փոխում է uintptr-ը։
CompareAndSwapPointer Ատոմարապես համեմատում և փոխում է unsafe.Pointer-ը։
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
}