C++多線程-chap2多線程通信和同步7_一個例子

這裏,只是記錄自己的學習筆記。

順便和大家分享多線程的基礎知識。然後從入門到實戰。有代碼。

知識點來源:

https://edu.51cto.com/course/26869.html


 

 


使用互斥鎖 + list 模擬 線程通信

  • 1.封裝線程基類 XThread 控制線程啓動和停止
  • 2.模擬消息服務器線程,接收字符串消息,並模擬處理
  • 3.通過 unique_lock 和 mutex 互斥訪問 list<string> 消息隊列
  • 4.主線程定時發送消息給子線程

 

 

XThread 線程基類

xthread.h  文件 

 1 #pragma once
 2 #include <thread>
 3 
 4 class XThread
 5 {
 6 public:
 7     //啓動線程
 8     virtual void Start();
 9 
10     //設置線程退出標誌  並等待
11     virtual void Stop();
12 
13     //等待線程退出(阻塞)
14     virtual void Wait();
15 
16     //線程是否退出
17     bool is_exit();
18 
19 private:
20     //線程入口
21     virtual void Main() = 0;
22     bool is_exit_ = false;
23     std::thread th_;
24 };

xthread.cpp  文件

 1 #include "xthread.h"
 2 
 3 using namespace std;
 4 
 5 
 6 //啓動線程
 7 void XThread::Start() {
 8     is_exit_ = false;
 9     th_ = thread(&XThread::Main, this);
10 }
11 
12 //設置線程退出標誌  並等待
13 void XThread::Stop() {
14     is_exit_ = true;
15     Wait();
16 }
17 
18 //等待線程退出(阻塞)
19 void XThread::Wait() {
20     if (th_.joinable()) {
21         th_.join();
22     }
23 }
24 
25 //線程是否退出
26 bool XThread::is_exit() {
27     return is_exit_;
28 }

 

 

 

 

XMsgServer 消息基類

xmsg_server.h 文件

 1 #pragma once
 2 #include "xthread.h"
 3 #include <string>
 4 #include <list>
 5 #include <mutex>
 6 class XMsgServer:public XThread
 7 {
 8 public:
 9     //給當前線程發消息
10     void SendMsg(std::string msg);
11 
12 private:
13     //處理消息的線程入口函數
14     void Main()  override;
15 
16     //可以考慮給消息隊列設置一個最大值,超過最大值就阻塞,或者發送失敗等等
17     //消息隊列緩衝
18     std::list<std::string> msgs_;
19 
20     //互斥訪問消息隊列
21     std::mutex mux_;
22 };

 

xmsg_server.cpp 文件

 1 #include "xmsg_server.h"
 2 #include <iostream>
 3 using namespace std;
 4 using namespace this_thread;
 5 
 6 //給當前線程發消息
 7 void XMsgServer::SendMsg(std::string msg) {
 8     unique_lock<mutex> lock(mux_);
 9     msgs_.push_back(msg);
10 }
11 
12 
13     //處理消息的線程入口函數
14 void XMsgServer::Main() {
15     while(!is_exit()) {
16         sleep_for(10ms);
17         unique_lock<mutex> lock(mux_);
18         if (msgs_.empty())
19             continue;
20         while (!msgs_.empty()) {
21             //消息處理業務邏輯
22             cout << "recv : " << msgs_.front() << endl;
23             msgs_.pop_front();
24         }
25     }
26 }

 

 

hello.cpp文件

 1 #include <iostream>
 2 #include <string>
 3 #include <mutex>
 4 #include <thread>
 5 #include "xmsg_server.h"
 6 #include <sstream>
 7 using namespace std;
 8 
 9 int main()
10 {
11     XMsgServer  server;
12     server.Start();
13     for (int i = 0; i < 10; i++) {
14         stringstream ss;
15         ss << " msg : " << i + 1;
16         server.SendMsg(ss.str());
17         this_thread::sleep_for(500ms);
18     }
19 
20     server.Stop();
21     return 0;
22 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章