網(wǎng)站首頁 編程語言 正文
什么叫做隊(duì)列方式
在C++中隊(duì)列是一種常用的數(shù)據(jù)結(jié)構(gòu)之一,一種特殊的線性表,一般采用先進(jìn)先出的方式。
很多情況下,在做數(shù)據(jù)處理時(shí),會(huì)根據(jù)先來后到的原則進(jìn)行處理。對(duì)于少量數(shù)據(jù)來說,主進(jìn)程就可以很快完成,所以不需要用到開線程的方式。將處理處理部分封裝成一個(gè)函數(shù),直接調(diào)用就OK了!
假設(shè),數(shù)據(jù)處理的時(shí)間消耗很大時(shí),繼續(xù)使用主進(jìn)程處理的話,肯定會(huì)導(dǎo)致頁面卡死,為了避免頁面卡死,最常用的方式就是開線程。
在程序使用過程中肯定不止一個(gè)位置進(jìn)行數(shù)據(jù)處理,那么,多次調(diào)用數(shù)據(jù)處理時(shí),如何保證按照觸發(fā)順序進(jìn)行數(shù)據(jù)解析呢?
這是本篇文章中的重點(diǎn)~
想要按照觸發(fā)順序下發(fā),必須要對(duì)下發(fā)的數(shù)據(jù)進(jìn)行排隊(duì),這里用到的容器是list。方便添加、刪除。
容器:std::list m_list; //存儲(chǔ)數(shù)據(jù)
1.存儲(chǔ)需要處理的數(shù)據(jù)
std::lock_guard<std::mutex> lck(m_mutexRobotData); //上鎖添加數(shù)據(jù)
m_list.push_back(stData);
在進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí),進(jìn)行上鎖處理,因?yàn)樵诰€程中每處理一條數(shù)據(jù),需要進(jìn)行刪除,防止出錯(cuò)。
2.開啟線程
m_pThreadSendCmd = std::thread(&QWidget::ProcessingThread, this);
m_pThreadSendCmd.detach();
這里用到的是C11方式開啟線程,有一個(gè)弊端,使用功能detach方式后,已經(jīng)與程序脫離了,想要控制線程的關(guān)閉,保守的做法是由參數(shù)來控制。
這里,我才用了bool值,當(dāng)bool = false時(shí),說明線程停止;true表示線程正在運(yùn)行。
那么,對(duì)上述開啟線程方式進(jìn)行修改,如下:
if (m_bRunningRobotCmd == false)
{
//線程未開啟,開啟線程
qDebug() << QStringLiteral("開啟一個(gè)新線程");
m_bRunningRobotCmd = true;
m_pThreadSendCmd = std::thread(&QWidget::ProcessingThread, this);
m_pThreadSendCmd.detach();
}
3.線程中數(shù)據(jù)處理
void QWidget::ProcessingThread()
{
while(m_bRunningRobotCmd)
{
//線程處理
sleep(200);
}
//退出while循環(huán),表示線程結(jié)束
}
此時(shí),當(dāng)m_bRunningRobotCmd = true時(shí),表示線程一直在啟動(dòng),當(dāng)m_bRunningRobotCmd = false時(shí),立刻停止線程,這時(shí)又會(huì)遇到一個(gè)問題,正在運(yùn)行的線程中該如何停止呢?
單純的m_bRunningRobotCmd = false,很顯然停止的概率不大,此時(shí),對(duì)安全的做法,需要用互斥量的方式,進(jìn)行停止
對(duì)上述線程開啟進(jìn)行修改,如下:
void QWidget::ProcessingThread()
{
std::lock_guard<std::mutex> lck(m_mutexControlThread); //上鎖添加數(shù)據(jù)
while(m_bRunningRobotCmd)
{
//線程處理
sleep(200);
}
//退出while循環(huán),表示線程結(jié)束
}
關(guān)閉線程方式,如下:
m_bRunningRobotCmd = false;
std::lock_guard<std::mutex> lck(m_mutexControlThread); //插入數(shù)據(jù)之前,首先加鎖
首先將bool值更改,再進(jìn)行加鎖。
4.線程內(nèi)容實(shí)現(xiàn)邏輯
當(dāng)list容器中存在數(shù)據(jù)時(shí),需要獲取第一條數(shù)據(jù),處理后刪除第一條數(shù)據(jù)。
實(shí)現(xiàn)代碼如下:
if(m_list.size() != 0)
{
//容器中存在有效數(shù)據(jù)
std::lock_guard<std::mutex> lck(m_mutexRobotData); //上鎖添加數(shù)據(jù)
if(m_list.size() != 0)
{
//獲取第一條有效數(shù)據(jù)
stData stInfo = m_list.front();
//數(shù)據(jù)處理
//刪除第一條數(shù)據(jù)
m_list.pop_front();
}
}
使用互斥量的方式控制線程增加了安全性,防止崩潰問題。
原文鏈接:https://juejin.cn/post/7153420828959309855
相關(guān)推薦
- 2022-09-22 數(shù)據(jù)庫(kù)基本增刪改查語法和多表連查的方式
- 2022-07-03 C#并行編程之信號(hào)量_C#教程
- 2022-09-09 C++代碼和可執(zhí)行程序在x86和arm上的區(qū)別介紹_C 語言
- 2023-07-27 element plus 循環(huán)form表單校驗(yàn)
- 2022-03-16 .NET6自定義WebAPI過濾器_實(shí)用技巧
- 2023-05-20 pytorch中forwod函數(shù)在父類中的調(diào)用方式解讀_python
- 2024-02-28 UNI-APP,設(shè)置某個(gè)頁面橫屏后,恢復(fù)豎屏,返回再次進(jìn)入其他頁面時(shí),頁面內(nèi)容放大錯(cuò)亂
- 2024-01-08 Request請(qǐng)求轉(zhuǎn)發(fā)和Response重定向
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支