Ի՞նչ են ագրեգատային օպերացիաները, ինչ տեսակներ կան և երբ և ինչպես լավագույնս օգտագործել:
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
}