Kapitel 12
Alle Codedateien dieses Kapitels herunterladen
12_1_1_ThreadHelloWorld.cpp
#include <iostream>
#include <thread>
int main()
{
std::thread helloThread([]() {
std::cout << "Hello ";
});
std::thread worldThread([]() {
std::cout << "World ";
});
// Auf die Threads warten
helloThread.join();
worldThread.join();
return 0;
}
12_1_2_MitPunktUndKomma.cpp
#include <iostream>
#include <thread>
#include <chrono>
int main()
{
std::thread dot([]() {
for (int i = 0; i < 20; i++)
{
std::cout << ".";
// Mindestens 50 Millisekunden warten
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
});
std::thread comma([]() {
for (int i = 0; i < 20; i++)
{
std::cout << ",";
std::this_thread::sleep_for(std::chrono::milliseconds(50));
}
});
// Auf die Threads warten
dot.join();
comma.join();
return 0;
}
12_2_PiBerechnen.cpp
#include <atomic>
#include <iomanip>
#include <iostream>
#include <string>
#include <thread>
int main()
{
std::cout << "Beenden mit der Entertaste" << std::endl;
// Möglichst viele Nachkommastellen ausgeben:
std::cout << std::setprecision(15);
// Zwei atomare Variablen zum Steuern des Threads
std::atomic<bool> active = true;
std::atomic<double> result = 0;
std::thread leibniz([&]() {
// Diese Implementierung nutzt die Leibnitz-Formel
double sign = 1; // Vorzeichen (+1 oder -1)
double pi = 0;
double denominator = 1;
while (active)
{
pi = pi + sign * (4 / denominator);
// Vorzeichen umdrehen
sign = -sign;
// Teiler um zwei erhöhen
denominator += 2;
std::cout << "\rStatus (" << denominator << "): " << pi;
}
// Ergebnis in der atomaren Variable speichern
result = pi;
});
// Im Haupt-Thread derweil auf die Entertaste warten
std::string tmp;
std::getline(std::cin, tmp);
// Enter wurde gedrückt. Nun den Thread herunterfahren
active = false;
leibniz.join();
std::cout << "\rEndresultat: " << result << std::endl;
return 0;
}