سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ Alireza_Rubik
پروژه github
جامعه گولنگ ایجاد شده در ۱۹ مرداد ۱۴۰۲

با سلام و خسته نباشید

جسارتا یه سوالی داشتم من پروژه‌ها رو از github دانلود کردم برای تمرین

و داخل پروژه‌ها تمرینی بود برای RWMUTEX ممنون میشم یکمی درباره پروژه توضیح بدید

package main
import (
	"fmt"
	"math/rand"
	"sync"
	"sync/atomic"
	"time"
)
var mx = sync.Mutex{}
var rwmx = sync.RWMutex{}
type Breaker struct {
	Name  string
	Count int64
}
func main() {
	var mci = Breaker{"MCI", 0}
	var irancell = Breaker{"Irancell", 0}
	var rightel = Breaker{"Rightel", 0}
	for i := 0; i < 10_000; i++ {
		go AddBreak(&mci)
		go AddBreak(&irancell)
		go AddBreak(&rightel)
	}
	time.Sleep(time.Second * 2)
	fmt.Printf("MCI: %v\\n", mci)
	fmt.Printf("Irancell: %v\\n", irancell)
	fmt.Printf("Rightel: %v\\n", rightel)
}
func getRandomNumber(min int, max int) int {
	return (rand.Intn(max-min) + min)
}
func AddBreak(breaker *Breaker) {
	// rwmx.Lock()
	// (*breaker).Count++
	// rwmx.Unlock()
	atomic.AddInt64(&((*breaker).Count), 10)
}
func ReadBreaker(breaker *Breaker) {
	rwmx.RLock()
	fmt.Printf("%v: %v\\n", breaker.Name, breaker.Count)
	rwmx.RUnlock()
}
func ResetBreaker(breaker *Breaker) {
	(*breaker).Count = 0
}

سلام علیرضا جان

این مثال مربوط به افزایش مقدار یک متغیر به کمک atomic هستش.

کاری که اینجا انجام میشه مانند mutex تضمین میشه که مقدار متغیر فقط و فقط به اون اندازه ای که ما گفتیم افزایش پیدا کنه

atomic.AddInt64(&((*breaker).Count), 10) // Count = Count + 10

اما تفاوتی که در استفاده از atomic وجود داره در اینه که atomic از ویژگی Atomic Operation پردازنده استفاده می‌کنه و Performance بهتری داره.

برای آشنایی با این ویژگی این لینک رو ببینید


بهترین پاسخ
حامد نعیمایی ۲۰ مرداد ۱۴۰۲، ۲۲:۳۸