C++
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).
Örnek çözümü göster
#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;
}
Kendini test et
-
std::thread
std::____ t1([&]() { total += 1; });
Cevabı göster
std::thread t1([&]() { total += 1; });
-
std::atomic ne sağlar?
- Veri yarışı olmadan paylaşılan değişkene erişim
- Bellek tasarrufu
- Daha az kod
- Daha hızlı toplama
Cevabı göster
Veri yarışı olmadan paylaşılan değişkene erişim — std::atomic, veri yarışı olmadan paylaşılan değişkene erişim sağlar.
-
Üyeyi rolüne eşle
- std::thread
- İş parçacığı
- std::atomic
- Veri yarışı koruması
- join()
- Bekleme
- lambda
- İşçi gövdesi
Sıradaki ders: Design patterns