1、模板类queue,包含头文件<queue>中,是一个FIFO队列。

  1. queue.push():在队列尾巴增加数据
  2. queue.pop():移除队列头部数据
  3. queue.font():获取队列头部数据的引用
    ...

2、Qt库的线程池,QThreadPool

  1. QThreadPool.setMaxThreadCount():设置线程池最大线程数
  2. QThreadPool.start(new QRunnable(..)):开启线程池调用QRunnable

3、QRunnable执行任务

  1. void run();//重写虚函数,在里面消费任务队列
  2. setAutoDelete(true)//默认就是true,消费结束自动回收内存

4、代码

run.h

  1. #ifndef RUN_H
  2. #define RUN_H
  3.  
  4. #include <QObject>
  5. #include <QRunnable>
  6. #include <string>
  7. #include <iostream>
  8.  
  9. struct MyString
  10. {
  11. std::string valueStr;
  12. };
  13.  
  14. class Run : public QObject , public QRunnable
  15. {
  16. Q_OBJECT
  17. public:
  18. Run() = default;
  19. Run(const MyString& myString);
  20. protected:
  21. ~Run() = default;
  22. void run();
  23. signals:
  24.  
  25. public slots:
  26.  
  27. private:
  28. MyString myString;
  29. };
  30.  
  31. #endif // RUN_H
  32.  
  33. 说明:MyString结构体代替实际项目中的任务,Run接口的run纯虚函数用来消费分配来的MyString
  1. run.cpp
  1. #include "run.h"
  2. #include <QThread>
  3. #include <QDebug>
  4. Run::Run(const MyString &myString)
  5. {
  6. this->myString = myString;
  7. //this->setAutoDelete(true);//默认就是true
  8. }
  9.  
  10. void Run::run()
  11. {
  12. //std::cout << "value:" << this->myString.valueStr <<";调用线程ID为:" << QThread::currentThread() << std::endl;
  13. qDebug() << "value:" << QString::fromStdString(myString.valueStr) << "thread:" << QThread::currentThreadId();
  14. QThread::msleep();
  15. }
    说明:不使用cout打印是因为,cout打印不是原子操作,可能多个字符串被杂糅在一起打印;qDebug不会,应该底层加了锁

main.cpp

  1. #include <QCoreApplication>
  2. #include "run.h"
  3. #include <queue>
  4. #include <mutex>
  5. #include <QThreadPool>
  6. #include <thread>
  7. using namespace std;
  8. queue<MyString> myList;
  9. mutex myMutex;
  10. volatile bool addThreadIsEnd = false;
  11. void makeListThread();
  12. int main(int argc, char *argv[])
  13. {
  14. QCoreApplication a(argc, argv);
  15. cout << "begin main" << endl;
  16. thread addThread(makeListThread);
  17. addThread.detach();
  18. cout << "begin addThread" << endl;
  19. QThreadPool tp;
  20. tp.setMaxThreadCount();
  21. cout << "begin threadPool" << endl;
  22. while(true)
  23. {
  24. if(!myList.empty())
  25. {
  26. MyString tempMyString = myList.front();
  27. tp.start(new Run(tempMyString));
  28. myMutex.lock();
  29. myList.pop();
  30. myMutex.unlock();
  31. }
  32. else
  33. {
  34. if(addThreadIsEnd)
  35. {
  36. break;
  37. }
  38. else
  39. {
  40. QThread::msleep();
  41. }
  42. }
  43. }
  44. cout << "end main,list size:" << myList.size() << endl;
  45. return a.exec();
  46. }
  47.  
  48. void makeListThread()
  49. {
  50. string a;
  51. MyString tempMyString;
  52. for(int i=;i<;i++)
  53. {
  54. QThread::msleep();
  55. a = to_string(i);
  56. tempMyString.valueStr = a;
  57. myMutex.lock();
  58. myList.push(tempMyString);
  59. myMutex.unlock();
  60. }
  61. addThreadIsEnd = true;
  62. cout << "end addThread" << endl;
  63. }
  1. 5、模型

6、其他说明

6.1、假设线程池大小有n个,那么这n个线程在线程池初始化的时候就已经定了,即n个线程id是恒定的,队列永远由这n个线程消费

6.2、std::queue非线程安全,同时往队列加任务、取任务可能会触发线程安全问题;同时删除头任务、访问头任务也可能会触发线程安全问题,需要加线程锁

6.3、tp.start(new Run(tempMyString));这里new了一个没有指针指向的Runnable对象,在哪里回收的呢?Run.setAutoDelete(true)自动回收

  1.  

C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型的更多相关文章

  1. c++之初级的消息队列及线程池模型

    1.最近项目不是很忙,结合之前看的一些开源代码(skynet及其他github代码)及项目代码,抽空写了一个简单的任务队列当做练习. 2.介绍: 1)全局队列中锁的使用:多线程下,全局队列需要加锁,本 ...

  2. 自定义ThreadPoolExecutor带Queue缓冲队列的线程池 + JMeter模拟并发下单请求

    .原文:https://blog.csdn.net/u011677147/article/details/80271174 拓展: https://github.com/jwpttcg66/GameT ...

  3. java并发编程(四) 线程池 & 任务执行、终止源码分析

    参考文档 线程池任务执行全过程:https://blog.csdn.net/wojiaolinaaa/article/details/51345789 线程池中断:https://www.cnblog ...

  4. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  5. C# -- 使用线程池 ThreadPool 执行多线程任务

    C# -- 使用线程池 ThreadPool 执行多线程任务 1. 使用线程池 class Program { static void Main(string[] args) { WaitCallba ...

  6. ForkJoinPool线程池--分支执行

    import java.util.ArrayList; import java.util.concurrent.ExecutionException; import java.util.concurr ...

  7. Qt 线程池QThreadPool类、QRunnable类

    QThreadPool类 用来管理 QThreads.此类中的所有函数都是线程安全的. 主要属性: 1.activeThreadCount: 此属性表示线程池中的活动线程数,通过activeThrea ...

  8. QT 线程池 + TCP 小试(一)线程池的简单实现

    *免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 很久以前做过ACE + MFC/QT 的中轻量级线程池应用,大概就 ...

  9. Qt线程池

    说明 Qt中可以有多种使用线程的方式: 继承 QThread,重写 run() 接口: 使用 moveToThread() 方法将 QObject 子类移至线程中,内部的所有使用信号槽的槽函数均在线程 ...

随机推荐

  1. 如何制作一个Arduino温度数据记录仪

    在本项目中,我们将使用Arduino开发板制作一个温度数据记录仪,该设备从温度传感器LM35获取温度值,并从DS3231实时时钟模块获取时间.然后我们将使用mini SD卡模块将这些值存储在SD卡文件 ...

  2. 使用C#应用程序与Arduino开发板进行通信

    在本文中,我们将一个Arduino Pro Mini开发板连接到PC,并且使用C# Windows应用程序与其进行通信. 将硬件连接到PC是非常有利的,不仅是因为你可以发送命令以及监控状态,还可以实时 ...

  3. 解密Redis持久化【翻译】

    本文来自Redis的作者,他在论坛看到大家对Redis持久化误解较大,所以写此文章论述持久化 写操作的流程 首先我们来看一下数据库在进行写操作时到底做了哪些事,主要有下面五个过程. 客户端向服务端发送 ...

  4. MyEclipse修改运行内存

    修改  myeclipse.ini -vmargs -Xmx1768m -XX:MaxPermSize=1320m -XX:ReservedCodeCacheSize=64m -Dosgi.nls.w ...

  5. Socket实现client和server端通信(Java)(转)

    转自: https://blog.csdn.net/yayun0516/article/details/50819147 https://www.jianshu.com/p/2d4f223f1462 ...

  6. ZZNU - OJ - 2080 : A+B or A-B【暴力枚举】

    2080 : A+B or A-B(点击左侧标题进入zznu原题页面) 时间限制:1 Sec 内存限制:0 MiB提交:8 答案正确:3 提交 状态 讨论区 题目描述 Give you three s ...

  7. 2019-2020-1 20199312《Linux内核原理与分析》第一周作业

    实验一:linux系统简介 Linux 本身只是操作系统的内核.内核是使其它程序能够运行的基础.它实现了多任务和硬件管理,用户或者系统管理员交互运行的所有程序实际上都运行在内核之上.其中有些程序是必需 ...

  8. 1~n中数字0~9出现的次数

    题意:rt 分析: 当然不可能去遍历,应该寻找统计的方法. 如计算 78501 中 "5" 出现的次数. 我们可以枚举“5”出现的位置, 如当“5”位于倒数第2位时,写成 xxx5 ...

  9. 编写一个求圆面积的C语言程序

    #include<stdio.h>   //文件包含//#define PI 3.14     //宏定义//void main()         { float r,s; scanf( ...

  10. [React + GraphQL] Use useLazyQuery to manually execute a query with Apollo React Hooks

    When using useQuery from Apollo React Hooks, the request will be sent automatically after the compon ...