// 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
}