1 | // Kompilieren mit: g++ -Wall main.cpp -o main -pthread -std=c++14
|
2 | // Zeit unter Linux ändern: sudo date +%T -s "01:05:00"
|
3 |
|
4 | #include <iostream>
|
5 | #include <atomic>
|
6 | #include <condition_variable>
|
7 | #include <thread>
|
8 | #include <chrono>
|
9 | using namespace std::chrono_literals;
|
10 |
|
11 | std::condition_variable cv;
|
12 | std::mutex cv_m;
|
13 | std::atomic<int> i{0};
|
14 |
|
15 | void waits()
|
16 | {
|
17 | std::unique_lock<std::mutex> lk(cv_m);
|
18 |
|
19 | auto absTimeout = std::chrono::steady_clock::now() + 15s;
|
20 | if (cv.wait_until(lk, absTimeout, [&](){ return i == 1; })) {
|
21 | // signal received
|
22 | std::cerr << "Thread finished waiting. signal received i == " << i << '\n';
|
23 | }
|
24 | else {
|
25 | std::cerr << "Thread timed out. i == " << i << '\n';
|
26 | }
|
27 | }
|
28 |
|
29 | void signals()
|
30 | {
|
31 | std::this_thread::sleep_for(250s);
|
32 | {
|
33 | std::lock_guard<std::mutex> lk(cv_m);
|
34 | i = 1;
|
35 | }
|
36 | std::cerr << "Notifying...\n";
|
37 | cv.notify_all();
|
38 | }
|
39 |
|
40 | int main()
|
41 | {
|
42 | std::thread t1(waits), t2(signals);
|
43 | t1.join();
|
44 | t2.join();
|
45 | }
|