CodeBlanks Logo Icon CodeBlanks

Concurrency

std::thread ve atomic ile paralel işleme yazarsın.

Concurrency katmanı

Bu derste Framework'e parallel_sum metodunu ekleyeceğiz. Bu metod, std::thread ile bir iş parçacığı başlatır ve std::atomic ile veri yarışı olmadan toplar.

Örnek: std::atomic<int> total{0}; std::thread t1([&]() { for (auto x : data) if (x > 0) total += x; }); t1.join();. std::atomic, total += x işlemini atomik yapar; böylece birden çok iş parçacığı aynı değişkene güvenle yazar. join() ile iş parçacığının bitmesini bekleriz. Bu, paralel hesaplamayı şablonumuza taşır. Önceki dersin process_data metodu yerinde kalır.

std::atomic ile güvenli erişim

Birden çok iş parçacığı aynı değişkene yazarsa veri yarışı (data race) oluşur ve davranış tanımsızdır. std::atomic bu sorunu çözer: her yazma/okuma atomik olur.

Örnek: std::atomic<int> total{0};. total += x; atomik bir okuma-değiştirme-yazma işlemidir. İş parçacığı join() ile beklenince, total'in son değeri güvenle okunabilir. return total; ile atomic<int> örtük olarak int'e dönüşür. Bu, kilitsiz (lock-free) paralel toplamanın temelidir.

Uygulama parallel_sum metodunu ekle

Framework'e int parallel_sum(const std::vector<int>& data) metodunu ekle. Gövde: std::atomic<int> total{0};, std::thread t1([&]() { for (auto x : data) if (x > 0) total += x; });, t1.join();, return total;. run içinde std::cout << "paralel: " << parallel_sum(data); satırını ekle (önceki satıra << std::endl de ekle).

Başlangıç kodu

main.cpp
#include <iostream>
#include <string>
#include <vector>
#include <ranges>
#include <algorithm>
#include <concepts>
#include <thread>
#include <atomic>

class Framework {
public:
    int run();
    template<std::integral T>
    int process_data(const std::vector<T>& data);
    // parallel_sum metodunu ekle (thread + atomic)
};

template<std::integral T>
int Framework::process_data(const std::vector<T>& data) {
    int sum = 0;
    for (auto x : data | std::views::filter([](T v) { return v > 0; })) {
        sum += x;
    }
    return sum;
}

int Framework::run() {
    std::cout << "Proje hazır" << std::endl;
    std::vector<int> data{1, -2, 3};
    std::cout << "toplam: " << process_data(data) << std::endl;
    // parallel_sum cagir ve sonuçu yazdir
    return 0;
}

int main() {
    Framework fw;
    fw.run();
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <string>
#include <vector>
#include <ranges>
#include <algorithm>
#include <concepts>
#include <thread>
#include <atomic>

class Framework {
public:
    int run();
    template<std::integral T>
    int process_data(const std::vector<T>& data);
    int parallel_sum(const std::vector<int>& data);
};

template<std::integral T>
int Framework::process_data(const std::vector<T>& data) {
    int sum = 0;
    for (auto x : data | std::views::filter([](T v) { return v > 0; })) {
        sum += x;
    }
    return sum;
}

int Framework::parallel_sum(const std::vector<int>& data) {
    std::atomic<int> total{0};
    std::thread t1([&]() { for (auto x : data) if (x > 0) total += x; });
    t1.join();
    return total;
}

int Framework::run() {
    std::cout << "Proje hazır" << std::endl;
    std::vector<int> data{1, -2, 3};
    std::cout << "toplam: " << process_data(data) << std::endl;
    std::cout << "paralel: " << parallel_sum(data);
    return 0;
}

int main() {
    Framework fw;
    fw.run();
    return 0;
}

Beklenen çıktı

Proje hazır
toplam: 4
paralel: 4

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 std::thread

Soru
std::____ t1([&]() { total += 1; });
Cevap
std::thread t1([&]() { total += 1; });

Açıklama: std::thread bir iş parçacığı başlatır.

2 std::atomic ne sağlar?

  • Veri yarışı olmadan paylaşılan değişkene erişim Doğru cevap
  • Bellek tasarrufu
  • Daha az kod
  • Daha hızlı toplama

Açıklama: std::atomic, veri yarışı olmadan paylaşılan değişkene erişim sağlar.

3 Üyeyi rolüne eşle

Kavram Anlamı
std::thread İş parçacığı
std::atomic Veri yarışı koruması
join() Bekleme
lambda İşçi gövdesi

İleri seviye bölümündeki tüm dersler