Race Condition nədir?

Race Condition nədir?

Əvvəlki məqalədə qısaca goroutine  concurrency haqqında öyrənmişdik.

Go proqramlaşdırma dilində goroutine istifadə edərək kod yazan zaman race condition problemi ilə tez tez qarşılaşırıq. Race Condition birdən çox goroutine-nin (thread) eyni yaddaş sahəsindəki dəyəri dəyişdirməsi ilə meydana gəlir. Yəni ki, biz bir dəyişəni birdən çox goroutine üzərində ortaq olaraq paylaşsaq bu zaman race condition yaranır. Aşağıdakı nümunəyə baxaq.

Burada foo adında dəyişən yaradıb, ilkin dəyərini 0 veririk. Sonra iki ədəd goroutine içərisində həmən dəyişənin dəyərini 1 vahid artırırıq və bu proses count qədər dəvam edir (yazmış olduğumuz goroutine-lərin bitməsini gözləmək üçün  WaitGroup istifadə olunur). Kodu işlətdikdən sonra aşağıdakı nəticəni alırıq.

Gördüyünüz kimi nəticə gözlədiyimiz kimi alınmadı. Her dəfə eyni kodu işlətdikdə nəticə hər dəfə fərqli alınacaq. Buna səbəb race condition ilə izah olunur. Yəni iki goroutine eyni vaxtda foo dəyərini artırmağa çalışacaq və burada foo 2 vahid yox yalnız bir vahid artmış olacaq.

Race Condition necə təyin edilir?

Go proqramlaşdırma dilində race condition vəziyyətinin olub olmamasını yoxlamaq üçün -race flag-i istifadə olunur. 

- go run -race main.go

Terminalda əmri işlədib aşağıdakı nəticəni alırıq.

Race Condition necə həll olunur?

Race Condition problemini həll etmək üçün foo dəyərinin eyni anda əlçatan olmasının qarşısını almaq lazımdır. Bunun üçün go proqramlaşdırma dilində sync paketi içərisindəki Mutex istifadə olunur. Mutex "Mutual Exclusion" qısaltmasıdır və qarşılıqlı təcrid etmək mənasına gəlir. İndi kodumuza sync.Mutex əlavə edərək yenidən yazaq.

Burada mu adında yeni dəyişən təyin etdik. Hər iki gorutine üçün foo dəyirini artırmazdan əvvəl mu.Lock edib, proses bitdikdən sonra mu.Unlock etdik. Goroutine mu.Lock gördüyü zaman foo dəyişənini digər goroutine-lər üçün əlçatmaz edəcək, kilidləyəcək. Sonda isə mu.Unlock dəyərək kilidi açmış oluruq. Kodu işlədərək aşağıdakı nəticəni alırıq.

Artıq Race Condition yaranmadığı üçün nəticə istədiyimiz kimi olacaq.