C++ Library Extensions 2022.12.09
To help learn modern C++ programming
022-mutex.cpp
Go to the documentation of this file.
1#include <tpf_output.hpp>
2#include <future>
3#include <condition_variable>
4#include <thread>
5
6constexpr int max_count = 12;
7constexpr int max_players = 3;
8
9int whose_turn = 0;
10std::atomic<int> count{0};
11
14
15void worker(const char* name, int my_turn)
16{
17 while(count < max_count)
18 {
19 std::unique_lock<std::mutex> unique_lock(mutex);
20 condition_variable.wait(unique_lock,
21 [my_turn]{ return (my_turn == whose_turn) || (count >= max_count); });
22
23 if(count < max_count)
24 {
26 stream << count <<", " << name <<" ["
27 << std::this_thread::get_id()<<"]"<<tpf::endl;
28
29 ++count; ++whose_turn;
30
32 whose_turn = 0;
33
34 condition_variable.notify_all();
35 }
36 else
37 {
38 condition_variable.notify_all();
39 break;
40 }
41 }
42}
43
45{
46 try
47 {
48 auto f0 = std::async(std::launch::async, // start thread immediately,
49 // if fails to launch the thread,
50 // it throws std::system_error
51 worker, // thread routine
52 "A", 0 /* arguments for worker routine */);
53
54 auto f1 = std::async(std::launch::async, worker, "B", 1);
55 auto f2 = std::async(std::launch::async, worker, "C", 2);
56
57 f0.get(); // wait until f0 ends
58 f1.get();
59 f2.get();
60 }
61 catch(const std::system_error& e)
62 {
64 stream << e << tpf::endl;
65 }
66}
67
68int main()
69{
71}
std::mutex mutex
Definition: 022-mutex.cpp:12
int whose_turn
Definition: 022-mutex.cpp:9
constexpr int max_players
Definition: 022-mutex.cpp:7
std::atomic< int > count
Definition: 022-mutex.cpp:10
void worker(const char *name, int my_turn)
Definition: 022-mutex.cpp:15
void example_for_synchronization()
Definition: 022-mutex.cpp:44
std::condition_variable condition_variable
Definition: 022-mutex.cpp:13
constexpr int max_count
Definition: 022-mutex.cpp:6
int main()
Definition: 022-mutex.cpp:68
tpf::sstream stream
constexpr auto endl
Definition: tpf_output.hpp:973
Stream output operators << are implemented.