Kapitel 12

Alle Codedateien dieses Kapitels herunterladen

12_1_1_ThreadHelloWorld.cpp

Datei herunterladen

#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

Datei herunterladen

#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

Datei herunterladen

#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;
}