Concurrency
- C++ kursu
- İleri seviye
- Ders 81/83
- 6 dk
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
#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
#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
std::____ t1([&]() { total += 1; });
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 |