W
Size: a a a
W
AS
AS
M
M
AS
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);
}
M
П
AS
SK
П
AS
П