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呢?

相關文章
相關標籤/搜索