Advanced   Java   Services std::thread  C++ 11


Voraussetzungen

Erst C++ 11 liefert eine platformunmabhängige Behandlung von Threads. Verwendet man MINGW so braucht man dafür das "posix"-Package


includes
#include <thread>
#include <algorithm>
#include <chrono>

Man braucht auch <algorithm>. Da man oft mit sleep arbeiten muß braucht man noch <chrono> meist für std::chrono::seconds oder milliseconds etc. etwa in "std::this_thread::sleep_for (std::chrono::seconds(n))"


std::thread und Eclipse

Es empfiehlt sich die Testprogramme von der Konsole zu starten, Konsolausgaben in Eclipse sind langsam und verfälschen den Vorgang.


join

Die folgenden zwei Funktionen laufen in zwei eigenen Threads.

void task1()
{
   for(char ch='A'; ch<'A'+7; ++ch)
      cout << "task1-" << ch << endl;  // nicht atomar, da zwei ausgaben
}

void task2(int howOften)
{
   for(int i=0; i<howOften; ++i)
      cout << "task2-" << i << endl;  // nicht atomar, da zwei ausgaben
}

main wartet auf zwei Threads.

/*
 * ohne join wird eine runtime-exception geworfen, die man nicht abfangen kann
 * hier wartet main mit join auf task1, join blockiert
 * ein join am ende von main blockiert insofern, daß main wartet bis
 * der zugehörige (zweite und letzte) thread beendet ist
 */

void main_joins_2_threads()
{
   std::thread thread1(task1);
   std::thread thread2(task2, 10);
   thread1.join();   // main wartet bis thread1 fertig ist
   cout << "task1 finished" << endl;

   for(int i=0; i<7; )
      cout << "main-" << i++ << endl;  // nicht atomar, da zwei ausgaben

   thread2.join();
   cout << "task2 finished, main ends" << endl;
}

Zwei Ausgaben


join und std::this_thread::get_id()

Die folgenden zwei Funktionen laufen in zwei eigenen Threads.

/* das makro __func__ gibt den namen der funktion aus
 */
void foo()
{
   for(char ch='A'; ch<'A'+7; ++ch)
      std::cout << __func__ << "-id" << std::this_thread::get_id() << "-" << ch << std::endl;
}
/* das makro __func__ gibt den namen der funktion aus
 */
void bar(int howOften)
{
   for(int i=0; i < howOften; ++i)
      std::cout << __func__ << "-id" << std::this_thread::get_id() << "-" << i << std::endl;
}

main wartet auf zwei Threads. Die Funktionen geben die id der Threads aus.

void main_joins_2_threads_id()
{
   std::thread thread1(foo);
   std::thread thread2(bar, 10);
   thread1.join();   // main wartet bis thread1 fertig ist
   cout << "task1 finished" << endl;

   for(int i=0; i<7; i++)
      std::cout << "main-id" << std::this_thread::get_id() << "-" << i << std::endl;

   thread2.join();
   cout << "task2 finished, main ends" << endl;
}

Zwei Ausgaben