網站首頁 編程語言 正文
什么叫做隊列方式
在C++中隊列是一種常用的數據結構之一,一種特殊的線性表,一般采用先進先出的方式。
很多情況下,在做數據處理時,會根據先來后到的原則進行處理。對于少量數據來說,主進程就可以很快完成,所以不需要用到開線程的方式。將處理處理部分封裝成一個函數,直接調用就OK了!
假設,數據處理的時間消耗很大時,繼續使用主進程處理的話,肯定會導致頁面卡死,為了避免頁面卡死,最常用的方式就是開線程。
在程序使用過程中肯定不止一個位置進行數據處理,那么,多次調用數據處理時,如何保證按照觸發順序進行數據解析呢?
這是本篇文章中的重點~
想要按照觸發順序下發,必須要對下發的數據進行排隊,這里用到的容器是list。方便添加、刪除。
容器:std::list m_list; //存儲數據
1.存儲需要處理的數據
std::lock_guard<std::mutex> lck(m_mutexRobotData); //上鎖添加數據
m_list.push_back(stData);
在進行數據存儲時,進行上鎖處理,因為在線程中每處理一條數據,需要進行刪除,防止出錯。
2.開啟線程
m_pThreadSendCmd = std::thread(&QWidget::ProcessingThread, this);
m_pThreadSendCmd.detach();
這里用到的是C11方式開啟線程,有一個弊端,使用功能detach方式后,已經與程序脫離了,想要控制線程的關閉,保守的做法是由參數來控制。
這里,我才用了bool值,當bool = false時,說明線程停止;true表示線程正在運行。
那么,對上述開啟線程方式進行修改,如下:
if (m_bRunningRobotCmd == false)
{
//線程未開啟,開啟線程
qDebug() << QStringLiteral("開啟一個新線程");
m_bRunningRobotCmd = true;
m_pThreadSendCmd = std::thread(&QWidget::ProcessingThread, this);
m_pThreadSendCmd.detach();
}
3.線程中數據處理
void QWidget::ProcessingThread()
{
while(m_bRunningRobotCmd)
{
//線程處理
sleep(200);
}
//退出while循環,表示線程結束
}
此時,當m_bRunningRobotCmd = true時,表示線程一直在啟動,當m_bRunningRobotCmd = false時,立刻停止線程,這時又會遇到一個問題,正在運行的線程中該如何停止呢?
單純的m_bRunningRobotCmd = false,很顯然停止的概率不大,此時,對安全的做法,需要用互斥量的方式,進行停止
對上述線程開啟進行修改,如下:
void QWidget::ProcessingThread()
{
std::lock_guard<std::mutex> lck(m_mutexControlThread); //上鎖添加數據
while(m_bRunningRobotCmd)
{
//線程處理
sleep(200);
}
//退出while循環,表示線程結束
}
關閉線程方式,如下:
m_bRunningRobotCmd = false;
std::lock_guard<std::mutex> lck(m_mutexControlThread); //插入數據之前,首先加鎖
首先將bool值更改,再進行加鎖。
4.線程內容實現邏輯
當list容器中存在數據時,需要獲取第一條數據,處理后刪除第一條數據。
實現代碼如下:
if(m_list.size() != 0)
{
//容器中存在有效數據
std::lock_guard<std::mutex> lck(m_mutexRobotData); //上鎖添加數據
if(m_list.size() != 0)
{
//獲取第一條有效數據
stData stInfo = m_list.front();
//數據處理
//刪除第一條數據
m_list.pop_front();
}
}
使用互斥量的方式控制線程增加了安全性,防止崩潰問題。
原文鏈接:https://juejin.cn/post/7153420828959309855
相關推薦
- 2022-10-12 Docker部署golang環境詳解_docker
- 2022-03-31 python常用內置模塊你了解嗎_python
- 2022-08-29 Python使用re模塊實現正則表達式操作指南_python
- 2023-10-17 uniapp中的image的src=“路徑”圖片不顯示
- 2022-03-29 詳解python字符串相關str_python
- 2023-11-26 數據結構:數組—特殊矩陣的壓縮存儲
- 2022-12-04 WxPython中控件隱藏與顯示的小技巧_python
- 2024-03-08 jdk版本不兼容 Error creating bean with name ‘springSecu
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支