main.cpp


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
}