c++日志输出库 spdlog 简介(3)多线程控制台输出日志

spdlog源码分析:https://www.cnblogs.com/eskylin/p/6483199.htmlhtml

spdlog的异步模式使得spdLog能够支持多线程,因而写了一个多线程的小例子:多线程

一、新建一个MFC工程。拖入两个按钮。异步

image

二、添加线程函数函数

在MFCApplication1Dlg.h中添加线程函数(Thread 1 和 Thread 2)的声明:源码分析

public: afx_msg void OnBnClickedOk(); afx_msg void OnBnClickedButton1(); afx_msg void OnBnClickedButton2(); static UINT Thread1(LPVOID pParam); static UINT Thread2(LPVOID pParam);

在CPP文件中添加函数代码:this

void CMFCApplication1Dlg::OnBnClickedButton1() { AfxBeginThread(Thread1, this); } void CMFCApplication1Dlg::OnBnClickedButton2() { AfxBeginThread(Thread2, this); } UINT CMFCApplication1Dlg::Thread1(LPVOID pParam) { auto console = spd::stdout_color_mt("console1"); try{ for (int i = 0; i < 10; i++){ Sleep(500); console->info("Thread 1,Count {}",i); } } catch (const spd::spdlog_ex& ex) { std::cout << "Thread 1 Logger failed: " << ex.what() << std::endl; } spdlog::drop("console1"); return 0; } UINT CMFCApplication1Dlg::Thread2(LPVOID pParam) { auto console = spd::stdout_color_mt("console2"); try{ for (int i = 0; i < 10; i++){ Sleep(500); console->info("Thread 2,Count {}", i); } } catch (const spd::spdlog_ex& ex) { std::cout << "Thread 2 Logger failed: " << ex.what() << std::endl; } spdlog::drop("console2"); return 0; }

在OnInitDialog()函数中添加开启控制台的代码:spa

// TODO: Add extra initialization here
 AllocConsole(); freopen("CONOUT$", "w+t", stdout);

依次点击结果以下:线程

image

三、解析:日志

点击两个按钮时,会触发输出log的子线程,同时在控制台窗口中输出log信息。code

须要注意的是,两个按钮中建立的logger均为控制台logger,可是名称不能相同,不然会发生重定义的错误。

auto console = spd::stdout_color_mt("console1"); auto console = spd::stdout_color_mt("console2");

mt和st,同步和异步模式的区别??

如上述代码所示:多线程在控制台输出日志时没有问题,若是多个线程同时向同一个txt文件中写入log呢?

相关文章
相关标签/搜索