Modernes C++ programmieren

Okt 23, 2024

lst-1014-godb.cpp

//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/d3dc1Tsj8 
#include <thread>
#include <barrier>
#include <iostream>
#include <vector>
long fib(long n) { return n<=1 ? n : fib(n-1)+fib(n-2); }

constexpr int anz = 8;             // 8 Worker
constexpr int max_n = 32;          // bis 32 berechnen
std::vector<long> ergebnisse(anz); // Puffer: Platz für 8 Ergebnisse

void ausgeben() {                  // Signalisierungsfunktion druckt Puffer
    for (auto n : ergebnisse) std::cout << n << ' ';
    std::cout << '\n';
}

std::barrier ba{anz, ausgeben};    // immer nach 8 ausgeben

void worker(std::stop_token st, int idx) {
    // n = 0, 9, 17, 25,  ; 1, 10, 18, 26, 
    for(int n = idx; n<max_n; n += anz) {
        if(st.stop_requested()) return;
        ergebnisse[idx] = fib(n);  // schreibe Ergebnis in Puffer
        ba.arrive_and_wait();      // warte, bis 8 Threads hier sind
    }
}

int main() {
    std::vector<std::jthread> threads;     // 8 Threads
    for (int idx=0; idx<anz; ++idx) {
        threads.emplace_back(worker, idx); // erzeuge Thread mit Index
    }
    for (auto& t : threads) t.join();      // warte, bis alle fertig sind
}