sinnfreies beispiel umbauen, mit condition_variable
-
wie kann ich folgendes beispiel mit condition_variable machen ?
#include <iostream> #include <thread> auto work1(volatile int &run) -> void { const int wait_seconds = 1000; int waited = 0; while(run != 0) { while(waited < wait_seconds && run != 0) { _sleep(500); waited += 500; } if(run != 0) { std::cout << "do my job1...\n"; waited = 0; } } } auto work2(volatile int &run) -> void { const int wait_seconds = 1500; int waited = 0; while(run != 0) { while(waited < wait_seconds && run != 0) { _sleep(500); waited += 500; } if(run != 0) { std::cout << "do my job2...\n"; waited = 0; } } } auto main(int params_count, char **params) -> int { int run = 1; std::cout << "erstelle thread1\n"; std::thread thread1([&run](void) { work1(run); }); std::cout << "erstelle thread2\n"; std::thread thread2([&run](void) { work2(run); }); std::cout << "sleep 5 seconds\n"; _sleep(5000); std::cout << "programm wird beendet\n"; run = 0; thread1.join(); thread2.join(); std::cout << "exit app\n"; return 0; }
die beiden threads warten also unterschiedlich lange um ihre arbeit im interval zu erledigen, bzw. gehen raus, wenn run gleich 0 ist.
wie mach ich das mit condition_variable ?noch ne frage zu meinem beispiel: theoretisch duerfte hier nichts passieren oder ? da es nur einen thread gibt der die variable run aendert.
Meep Meep
-
Du machst dir z.B. ne struct wo deine "run" Variable (ohne volatile) drinnen ist, und ne Mutex, und ne Condition-Variable.
Dann kannst du nen Zeiger bzw. ne Referenz auf diese struct an die Threads übergeben.Überall wo du auf die "run" Variable zugreifst (lesend oder schreibend) musst du nun die Mutex locken.
Wenn du warten willst bis sich der Inhalt der Variable ändert, dann verwendest du
wait
der Condition-Variable. Wenn du dabei max. so-und-so lange warten willst, dann nimmst duwait_for
. Bzw.wait_until
wenn du ne absolute Deadline hast. Wenn du die Variable änderst, dann rufst dunotify_all
auf.In deinem Fall ist vermutlich ne absolute Deadline mit der
std::steady_clock
angesagt.