網(wǎng)站開發(fā)中的抓包工具網(wǎng)站代運(yùn)營(yíng)多少錢一個(gè)月
出處:B站碼出名企路
個(gè)人筆記:因?yàn)槭歉鴅站的教學(xué)視頻以及文檔初步學(xué)習(xí),可能存在諸多的理解有誤,對(duì)大家僅供借鑒,參考,然后是B站up陽哥的視頻,我是跟著他學(xué)。大家有興趣的可以到b站搜索。加油,一起學(xué)習(xí)。我的問題,大家如果看見,希望可以提出指正,謝謝大家。
應(yīng)用場(chǎng)景
多線程的應(yīng)用場(chǎng)景非常多,常見的有:
-
網(wǎng)絡(luò)通信:在網(wǎng)絡(luò)通信應(yīng)用中,一般需要同時(shí)處理多個(gè)請(qǐng)求,如果使用單線程模式,會(huì)阻塞其他請(qǐng)求,造成性 能瓶頸,因此使用多線程可以提高并發(fā)處理能力。
-
數(shù)據(jù)庫操作:在數(shù)據(jù)庫操作中,有時(shí)需要同時(shí)對(duì)多個(gè)數(shù)據(jù)表進(jìn)行操作,使用多線程可以提高處理效率。
-
圖像處理:在圖像處理應(yīng)用中,需要對(duì)多個(gè)圖像進(jìn)行處理,在單線程模式下,處理速度會(huì)很慢,使用多線程可 以提高處理速度。
-
游戲開發(fā):在游戲開發(fā)中,常常需要同時(shí)處理多個(gè)任務(wù),比如處理游戲畫面、物理效果、聲音效果等,使用多 線程可以提高游戲的運(yùn)行速度和流暢度。
-
并行計(jì)算:在科學(xué)計(jì)算領(lǐng)域中,常常需要對(duì)大量數(shù)據(jù)進(jìn)行處理和計(jì)算,使用多線程可以將計(jì)算任務(wù)劃分到多個(gè) 線程中進(jìn)行,從而提高計(jì)算速度。
總之,多線程在提高程序性能、響應(yīng)性和資源利用率方面有著廣泛的應(yīng)用。然而,需要注意在多線程編程中處理線程同步、共享數(shù)據(jù)等問題,以確保程序的正確性和穩(wěn)定性。
圖解結(jié)構(gòu)
模塊拆解
第一步:StateSubmitor耗時(shí)內(nèi)容處理類
此處并沒有很多具體實(shí)現(xiàn),因?yàn)橐Y(jié)合業(yè)務(wù)。比如耗時(shí)處理邏輯
class StateSubmitor {public:explicit StateSubmitor(const std::string& str);~StateSubmitor();//submit: 提交到隊(duì)列中//const std::string& content 內(nèi)容,包括海量數(shù)據(jù)void submit(const std::string& content);//content可任意//flush: 將隊(duì)列中的所有狀態(tài)信息發(fā)往遠(yuǎn)程收集端//具體的業(yè)務(wù)邏輯void flush();private:StateSubmitor(const StateSubmitor&) = delete;StateSubmitor& operator=(const StateSubmitor&) = delete;};
void StateSubmitor::submit(const std::string& content){/*@ 對(duì) content的耗時(shí)處理邏輯*/}
第二步:NodeMonitor線程啟動(dòng)類
//節(jié)點(diǎn)監(jiān)控, 監(jiān)控任務(wù)的發(fā)生, 業(yè)務(wù)的產(chǎn)生. 多線程同步等控制邏輯的封裝class NodeMonitor{public:~NodeMonitor();static NodeMonitor* instance();void start();void shutdown();bool init();private:NodeMonitor();NodeMonitor(const NodeMonitor&) = delete;NodeMonitor& operator=(const NodeMonitor&) = delete;void stateInfo(const std::string& strs);void ThreadFunc(); //消費(fèi)者線程入口函數(shù)bool shutdown_; //開關(guān) std::mutex mutex_; std::thread thread_; //消費(fèi)者線程std::condition_variable cond_;//queuestd::queue<std::string> task_queue_; //任務(wù)隊(duì)列std::unique_ptr<StateSubmitor> submitor_; //unique_ptr管理submitor對(duì)象};}
具體實(shí)現(xiàn),這里才是多線程同步互斥的重點(diǎn)部分,核心,利用任務(wù)隊(duì)列做緩沖容器,解耦合。使得生產(chǎn)者線程和消費(fèi)者線程之間的耦合度降低,生產(chǎn)者只管將任務(wù)放入任務(wù)隊(duì)列,然后即可返回,無需等待消費(fèi)者處理。消費(fèi)者只管從任務(wù)隊(duì)列中拿取任務(wù)處理。大大提高效率。通過緩存大大減低了生產(chǎn)者和消費(fèi)者之間的耦合程度。
生活場(chǎng)景:快遞驛站,快遞小哥就是生產(chǎn)者,我們就是消費(fèi)者??爝f驛站就是容器隊(duì)列。
//析構(gòu)一般獨(dú)立一個(gè)函數(shù)NodeMonitor::~NodeMonitor(){this->shutdown();//做資源釋放等等操作}//創(chuàng)建線程安全的單例//call_once 確保多線程下僅僅創(chuàng)建一個(gè)NodeMonitor對(duì)象NodeMonitor* NodeMonitor::instance(){static NodeMonitor* instance = nullptr;static std::once_flag flag; std::call_once(flag, [&]{instance = new (std::nothrow) NodeMonitor();});return instance; }//線程啟動(dòng)void NodeMonitor::start(){//創(chuàng)建消費(fèi)者thread_ = std::thread(&NodeMonitor::ThreadFunc, this);//啟動(dòng)生產(chǎn)者if (!init()){return;}}//生產(chǎn)者函數(shù)bool NodeMonitor::init(){submitor_.reset(new StateSubmitor("lyy")); //創(chuàng)建submitor/*@ 不斷地填充stateInfo@ 如果是實(shí)際應(yīng)用場(chǎng)景可能會(huì)采取輪詢, 或者是event事件觸發(fā), 此處陽哥按照最簡(jiǎn)單的塞入文本信息作為事件(任務(wù))*/while (true){stateInfo("lxk");}return true;}//填入需要的信息 <=> push任務(wù)void NodeMonitor::stateInfo(const std::string& strs){std::unique_lock<std::mutex> lock(mutex_);task_queue_.push(strs); //生產(chǎn), 塞入任務(wù)cond_.notify_one(); //通知消費(fèi)}//線程銷毀void NodeMonitor::shutdown(){std::unique_lock<std::mutex> lock(mutex_);shutdown_ = true;cond_.notify_all();if (thread_.joinable()){thread_.join();}}//消費(fèi)者函數(shù)void NodeMonitor::ThreadFunc(){while (!shutdown_){std::unique_lock<std::mutex> lock(mutex_);cond_.wait(lock, [this]{return shutdown_ || !task_queue_.empty();});if (shutdown_){break;}std::string str = task_queue_.front();task_queue_.pop();lock.unlock();submitor_->submit(str);//提交狀態(tài)信息}}
具體案例
消息隊(duì)列作業(yè)實(shí)現(xiàn)
#include <iostream>
#include <queue>
#include <mutex>
#include <thread>
#include <memory>
#include <condition_variable>
#include <string>
#include <chrono>namespace XX
{class MessageQueue {//封裝消息隊(duì)列類public:void push(const std::string& message); std::string pop(); bool empty();private:std::mutex mutex_; //互斥鎖, 保障互斥操作std::condition_variable cond_; //通知, 保障同步std::queue<std::string> msg_queue_; //容器};class StateSubmitor {//消息處理類, 業(yè)務(wù)處理, 管理消息隊(duì)列public:explicit StateSubmitor(MessageQueue& msg_queue);~StateSubmitor();void submit(const std::string& content); //提交狀態(tài)信息并將其添加到隊(duì)列中void flush(); //flush: 將隊(duì)列中的所有狀態(tài)信息發(fā)往遠(yuǎn)程收集端, 清空處理所有消息.private:StateSubmitor(const StateSubmitor &) = delete;StateSubmitor &operator=(const StateSubmitor &) = delete;private:MessageQueue& msg_queue_; //消息隊(duì)列};// 節(jié)點(diǎn)監(jiān)控, 監(jiān)控任務(wù)的發(fā)生, 業(yè)務(wù)的產(chǎn)生. 多線程同步等控制邏輯的封裝class NodeMonitor {public:~NodeMonitor();static NodeMonitor *instance();void start();void shutdown();bool init();private:NodeMonitor();void ProducerThreadFunc(); //線程函數(shù)void ConsumerThreadFunc(); //線程函數(shù)NodeMonitor(const NodeMonitor &) = delete;NodeMonitor &operator=(const NodeMonitor &) = delete;private:std::thread producer_thread_; //生產(chǎn)者線程,不停的往消息隊(duì)列塞入監(jiān)控到的用戶狀態(tài)信息消息.static int count_;std::unique_ptr<StateSubmitor> submitor_;MessageQueue msg_queue_; //消息隊(duì)列std::thread consumer_thread_;//消費(fèi)者線程, 不停的從消息隊(duì)列中抽出消息進(jìn)行處理bool shutdown_; //開關(guān)};
}namespace XX {int NodeMonitor::count_ = 0;//初始化void MessageQueue::push(const std::string& message) {std::unique_lock<std::mutex> lock(mutex_);msg_queue_.push(message);//塞入消息cond_.notify_one();//通知消費(fèi)}std::string MessageQueue::pop() {std::unique_lock<std::mutex> lock(mutex_);cond_.wait(lock, [this]{//等待消息到來return !empty();});std::string msg = msg_queue_.front();//拿到消息msg_queue_.pop();return msg;}bool MessageQueue::empty() {return msg_queue_.empty();}StateSubmitor::StateSubmitor(MessageQueue& msg_queue): msg_queue_(msg_queue) {} void StateSubmitor::submit(const std::string& content) {//提交狀態(tài)信息消息的業(yè)務(wù)操作std::cout << "消息為: " << content << std::endl;//將業(yè)務(wù)狀態(tài)消息push到消息隊(duì)列中msg_queue_.push(content);}void StateSubmitor::flush() {//清空所有消息}StateSubmitor::~StateSubmitor() {this->flush();}NodeMonitor::NodeMonitor():shutdown_(false){}NodeMonitor::~NodeMonitor(){this->shutdown();//釋放資源...操作}void NodeMonitor::ProducerThreadFunc() {while (!shutdown_) { //不斷生產(chǎn)std::this_thread::sleep_for(std::chrono::milliseconds(3000));std::string msg = "消息";msg += std::to_string(count_);count_ ++;submitor_->submit(msg);}}NodeMonitor* NodeMonitor::instance(){static NodeMonitor* instance = nullptr;static std::once_flag flag; std::call_once(flag, [&]{instance = new (std::nothrow) NodeMonitor();});return instance; }void NodeMonitor::ConsumerThreadFunc() {while (!shutdown_) { //不斷消費(fèi)std::this_thread::sleep_for(std::chrono::milliseconds(2000));std::string msg = msg_queue_.pop();//彈出一條消息std::cout << "處理了: " << msg << std::endl;}}void NodeMonitor::start() {init();}void NodeMonitor::shutdown() {shutdown_ = true;}bool NodeMonitor::init() {submitor_.reset(new StateSubmitor(msg_queue_)); //創(chuàng)建submitor//創(chuàng)建生產(chǎn)者,消費(fèi)者線程并且joinproducer_thread_ = std::thread(&NodeMonitor::ProducerThreadFunc, this);consumer_thread_ = std::thread(&NodeMonitor::ConsumerThreadFunc, this);producer_thread_.join();consumer_thread_.join();return true;}
}int main() {XX::NodeMonitor::instance()->start();return 0;
}