IZ
Size: a a a
IZ
К
AF
AF
AF
AF
AS
TS
AF
AS
#include "pretty_thread_logger.h"
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
namespace example
{
std::mutex condvar_mutex;
std::condition_variable condvar;
bool product = false;
void producer()
{
using namespace std::chrono_literals;
pretty_thread_logger::info("producer enter");
pretty_thread_logger::info("std::this_thread::sleep_for(2s);");
std::this_thread::sleep_for(2s);
pretty_thread_logger::info("std::lock_guard<std::mutex> guard{ condvar_mutex };");
std::lock_guard<std::mutex> guard{ condvar_mutex };
pretty_thread_logger::info("product = true;");
product = true;
pretty_thread_logger::info("condvar.notify_all();");
condvar.notify_all();
pretty_thread_logger::info("producer leave");
}
void consumer()
{
using namespace std::chrono_literals;
pretty_thread_logger::info("consumer enter");
pretty_thread_logger::info("std::unique_lock<std::mutex> exit_locker{ condvar_mutex };");
std::unique_lock<std::mutex> locker{ condvar_mutex };
pretty_thread_logger::info("condvar.wait");
condvar.wait(locker, []()
{
return product;
});
pretty_thread_logger::info("consumer leave");
}
void test()
{
pretty_thread_logger::info("test enter");
pretty_thread_logger::info("create producer");
std::thread p{ producer };
pretty_thread_logger::info("create consumer 1");
std::thread c1{ consumer };
pretty_thread_logger::info("create consumer 2");
std::thread c2{ consumer };
pretty_thread_logger::info("wait for producer done");
p.join();
pretty_thread_logger::info("wait for consumer 1 done");
c1.join();
pretty_thread_logger::info("wait for consumer 2 done");
c2.join();
pretty_thread_logger::info("test leave");
}
}
int main() {
example::test();
pretty_thread_logger::set_thread_column_width(30);
pretty_thread_logger::show(std::cout);
}
IZ
DB
AS
DB
AS
ПК
DP
ДВ
D
/