0Pricing
Swift Academy · Ders

Veri Yarışı Sorunu

Eşzamanlı değiştirmenin neden güvenli olmadığını anlayın.

Veri Yarışı Sorunu, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.

Veri Yarışı Nedir

Veri yarışı, iki veya daha fazla iş parçacığının aynı bellek konumuna eşzamanlı olarak erişmesi, erişimlerden en az birinin yazma işlemi olması ve aralarında hiçbir eşzamanlılık mekanizmasının bulunmaması durumunda gerçekleşir.

Sonuç tanımsız davranıştır: bozulmuş değerler, çökmeler veya yalnızca yoğun yük altında ortaya çıkan hatalar.

Paylaşılan Değişebilir Durum

Veri yarışlarının temel nedeni paylaşılan değişebilir durumdur. Birçok görev aynı değişkeni okuyup yazabiliyorsa işlem sırası öngörülemez hâle gelir.

Aşağıdaki sayaç artışları kaybedebilir; çünkü count += 1 atomik değil, oku-değiştir-yaz işlemidir.

final class Counter {
    var count = 0
    func increment() {
        count += 1 // read, add, write: not atomic
    }
}

Artışlar Neden Kaybolur

count += 1 ifadesi üç adıma derlenir: değeri yükleme, bir ekleme ve sonucu geri kaydetme.

İki iş parçacığı aynı anda 5 değerini yüklerse ikisi de 6 değerini kaydeder ve artışlardan biri kaybolur.

// Thread A loads 5
// Thread B loads 5
// Thread A stores 6
// Thread B stores 6  <-- lost update

Büyük Değerlerin Bölünmesi

Güncellemelerin kaybolmasının yanı sıra, birden çok sözcükten oluşan değerlere (örneğin bazı platformlarda bir yapı veya 64 bitlik bir değer) eşzamanlı yazılması bölünmeye neden olabilir: okuyucu, bir yazma işleminin yarısını ve başka bir yazma işleminin yarısını görür.

struct Point { var x: Double; var y: Double }
var p = Point(x: 0, y: 0)
// Concurrent writes may leave x from one write and y from another

Eski Çözüm: Kilitler

Swift Eşzamanlılığından önce klasik çözüm bir lock (karşılıklı dışlama kilidi) kullanmaktı. Aynı anda yalnızca bir iş parçacığı lock tutar ve erişimi sıraya koyar.

Kilitler işe yarar ancak yanlış kullanılmaları kolaydır: unutulan unlock işlemleri, kilitlenmeler ve öncelik tersine çevrilmesi.

import Foundation
final class SafeCounter {
    private let lock = NSLock()
    private var count = 0
    func increment() {
        lock.lock()
        defer { lock.unlock() }
        count += 1
    }
}

Seri Dispatch Kuyrukları

Bir başka klasik yaklaşım seri gönderim kuyruğudur. Tüm değişiklikler tek bir kuyruğa yönlendirilir; böylece hiçbir zaman çakışmazlar.

import Foundation
final class QueueCounter {
    private let queue = DispatchQueue(label: "counter")
    private var count = 0
    func increment() {
        queue.async { self.count += 1 }
    }
}

El ile Eşzamanlamanın Kırılganlığı

Kilitler ve kuyruklar disipline dayanır. Derleyici, her erişimin korunup korunmadığını denetlemez.

Korumasız tek bir okuma aradan sıyrıldığında yarış geri döner. Derleme zamanında hiçbir garanti yoktur.

// Nothing stops a careless reader from doing this:
// let value = counter.count  // unsynchronized read = race

Swift Eşzamanlılığı Oyunun Kurallarını Değiştiriyor

Swift Eşzamanlılığı, veri yarışı güvenliğini bir uzlaşı olmaktan çıkarıp dil özelliği hâline getirir.

Üç araç birlikte çalışır: korunan değişebilir durum için actor, güvenle paylaşılabilen türler için Sendable ve her ikisini zorunlu kılan derleyici.

actor Counter {
    private var count = 0
    func increment() { count += 1 }
}

Aktörler Erişimi Sıralı Hâle Getirir

Bir aktör, değişiklik yapan kodunu aynı anda yalnızca bir görevin çalıştırmasını garanti eder. Çalışma zamanı erişimi otomatik olarak sıraya koyar.

Hiçbir zaman kilit yazmazsınız; eşzamanlılık modeli eşzamanlamayı sağlar.

actor BankAccount {
    private(set) var balance = 0
    func deposit(_ amount: Int) { balance += amount }
}

Derleme Zamanında Zorlama

Derleyici, aktör tarafından yalıtılmış duruma aktör üzerinden geçmeden erişmenize izin vermez. Aktörler arası çağrılar eşzamansız hâle gelir (await).

Bu, çalışma zamanı yarışlarını derleme zamanı hatalarına dönüştürür.

let account = BankAccount()
// Must await: balance is actor-isolated
// let b = await account.balance

Sendable İş Parçacıkları Arasında Geçenleri Sınırlar

Sendable protokolü, eşzamanlılık sınırları arasında geçirilmesi güvenli olan türleri belirtir.

Derleyici, Sendable olmayan değişebilir durumun başka bir göreve gönderilmesini engeller ve yarışı tür düzeyinde önler.

struct Money: Sendable {
    let amount: Int
    let currency: String
}

Kısa Kontrol: Veri Yarışları

Veri yarışına neyin neden olduğunu anlayıp anlamadığınızı test edin.

Özet: Veri Yarışı Sorunu

Veri yarışları, paylaşılan değişebilir duruma eşzamanlı olarak ve eşzamanlama olmadan erişilmesinden kaynaklanır; bunun sonucunda güncellemeler kaybolabilir, değerler bölünebilir ve tanımsız davranış oluşabilir.

Eski çözümler (kilitler, seri kuyruklar) işe yarar ancak denetlenmez ve kırılgandır. Swift Eşzamanlılığı, uzlaşıyı zorunlu denetimle değiştirir: actor durumu yalıtır, Sendable sınırlar arasında nelerin geçebileceğini belirler ve derleyici güvenliği doğrular. Kursun geri kalanında bu araçları ayrıntılı olarak inceleyeceğiz.

Sıkça Sorulan Sorular

“Veri Yarışı Sorunu” dersi ücretsiz mi?

Evet — “Veri Yarışı Sorunu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.

“Veri Yarışı Sorunu” dersinde ne öğreneceğim?

Eşzamanlı değiştirmenin neden güvenli olmadığını anlayın. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Swift Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Veri Yarışı Sorunu” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Veri Yarışı Sorunu
  2. Sendable Protokolü
  3. Actor Yalıtımı ve nonisolated
  4. Katı Eşzamanlılığa Geçiş
← Swift Academy Sayfasına Dön