Advanced Java Services | std::thread C++ 11 |
Erst C++ 11 liefert eine platformunmabhängige Behandlung von Threads. Verwendet man MINGW so braucht man dafür das "posix"-Package
#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))"
Es empfiehlt sich die Testprogramme von der Konsole zu starten, Konsolausgaben in Eclipse sind langsam und verfälschen den Vorgang.
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
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