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

queue.push():在队列尾巴增加数据

queue.pop():移除队列头部数据

queue.font():获取队列头部数据的引用

...

2、Qt库的线程池,QThreadPool

QThreadPool.setMaxThreadCount():设置线程池最大线程数

QThreadPool.start(new QRunnable(..)):开启线程池调用QRunnable

3、QRunnable执行任务

void run();//重写虚函数,在里面消费任务队列

setAutoDelete(true)//默认就是true,消费结束自动回收内存

4、代码

run.h

#ifndef RUN_H#define RUN_H#include#include#include#include

structMyString

{

std::stringvalueStr;

};class Run : public QObject , publicQRunnable

{

Q_OBJECTpublic:

Run()= default;

Run(const MyString&myString);protected:~Run() = default;voidrun();

signals:publicslots:private:

MyString myString;

};#endif //RUN_H

说明:MyString结构体代替实际项目中的任务,Run接口的run纯虚函数用来消费分配来的MyString

run.cpp

#include "run.h"#include#includeRun::Run(const MyString &myString)

{this->myString =myString;//this->setAutoDelete(true);//默认就是true

}voidRun::run()

{//std::cout << "value:" << this->myString.valueStr <

qDebug() << "value:" << QString::fromStdString(myString.valueStr) << "thread:" <<:currentthreadid>

QThread::msleep(100);

}

说明:不使用cout打印是因为,cout打印不是原子操作,可能多个字符串被杂糅在一起打印;qDebug不会,应该底层加了锁

main.cpp

#include #include"run.h"#include#include#include#include

using namespacestd;

queuemyList;

mutex myMutex;volatile bool addThreadIsEnd = false;voidmakeListThread();int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

cout<< "begin main" <

thread addThread(makeListThread);

addThread.detach();

cout<< "begin addThread" <

QThreadPool tp;

tp.setMaxThreadCount(20);

cout<< "begin threadPool" <

{if(!myList.empty())

{

MyString tempMyString=myList.front();

tp.start(newRun(tempMyString));

myMutex.lock();

myList.pop();

myMutex.unlock();

}else{if(addThreadIsEnd)

{break;

}else{

QThread::msleep(10);

}

}

}

cout<< "end main,list size:" << myList.size() <

}voidmakeListThread()

{stringa;

MyString tempMyString;for(int i=0;i<10000;i++)

{

QThread::msleep(0);

a=to_string(i);

tempMyString.valueStr=a;

myMutex.lock();

myList.push(tempMyString);

myMutex.unlock();

}

addThreadIsEnd= true;

cout<< "end addThread" <

}

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)自动回收

qt下编写linux消息队列,C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型相关推荐

  1. 用Linux / C实现基于自动扩/减容线程池+epoll反应堆检测沉寂用户模型的服务器框架(含源码)

    用Linux/ C实现基于自动扩/减容线程池+epoll反应堆模型的服务器框架 前言 服务器端源码 客户端源码 自定义库 helper.c 和 helper.h helper.c helper.h M ...

  2. 基于Linux的C++轻量级web服务器/webserver/httpserver——线程池

    1. 背景 什么是线程池? 线程池技术是池化技术的一种.除了线程池,还是内存池.连接池等其他池化技术.打个比方来说,线程池是将若干个随时可以执行任务的线程放在"池子"这种容器中,当 ...

  3. 27.Linux网络编程socket变成 tcp 高并发 线程池 udp

    好,咱们开始上课了,从今天开始咱们连续讲 8 天的,网络编程这个还是在linux环境下去讲,咱们先看一下咱们这 8 天都讲什么东西,跟大家一块来梳理一下,你先有个大概的印象,这些你也不要记,那么网络编 ...

  4. 线程池 c linux 编程,关于c++:linux-c编程之高效线程池如何实现无琐化

    大多数线程池实现都离不开锁的应用,如互斥量pthread_mutex*联合条件变量pthread_cond*.家喻户晓,锁的应用对于程序性能影响较大,尽管现有的pthread_mutex*在锁的申请与 ...

  5. qtdll在linux系统运行,在QT下编写带DLL的程序

    注:我的工作目录是: D:\My Documents\MyProject 一.运行QtCreator 1.新建工程/选择C++ Library  这里设计被调用的DLL 下一步: 然后输入类名:它会生 ...

  6. squish用于qt下的linux

    官方文档(英文) https://doc.froglogic.com/squish/latest/ qt主要是4.1.1节 安装可以看 http://mp.weixin.qq.com/s?__biz= ...

  7. c 中服务器多次接受消息,c/s模拟高并发服务器端线程池接收问题

    //4.开启一个新线程不断接受用户的连接请求 ThreadPool.QueueUserWorkItem(new WaitCallback(skObj => { Socket skConnP = ...

  8. linux 查看java进城_linux查看java进程|线程池信息

    1.根据端口号57638查看对应进程pid/name=1463/java netstat -apn | grep  57638 tcp        0      0 ::ffff:172.20.5. ...

  9. SpringBoot 引入线程池+Queue缓冲队列实现高并发下单业务

    点击关注公众号,利用碎片时间学习 主要是自己在项目中(中小型项目) 有支付下单业务(只是办理VIP,没有涉及到商品库存),目前用户量还没有上来,目前没有出现问题,但是想到如果用户量变大,下单并发量变大 ...

最新文章

  1. Python几种主流框架
  2. eclipse中tomcat启动不了_Spring Boot中Tomcat是怎么启动的
  3. [一文一命令]tail命令详解
  4. 创建型模式—单例模式
  5. WinXP中快捷方式加箭头
  6. ASP.NET 2.0 之 Master Page 学习笔记
  7. word文档中插入特殊字符
  8. 孤独终老和勉强结婚,你会选什么?
  9. LIST函数JAVA特点_Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)...
  10. Kafka详解与总结(七)-Kafka producer拦截器(interceptor)
  11. struts2 拦截器返回值问题
  12. 剑网三手游哪个服务器人多稳定,“剑网三”手游开服后,我听了半个小时的骂街...
  13. 德州农工大学计算机硕士申请,2019至领留学获德州农工大学TAMU电子工程硕士ECE录取...
  14. HTML代码单元格内标题置顶,css表格标题怎么设置位置?
  15. 如何解决浏览器的兼容性
  16. 微信小程序--分享并设置分享链接的有效时间
  17. unity 环境光、模型、材质发绿,绿的发光
  18. kotlin完成 Code War 题目 解析分子公式
  19. linux wget
  20. 学术不端网查重靠谱吗_学术不端网知网查重万方哪一个权威

热门文章

  1. R语言ggplot2可视化增加轴标签(ticks)和轴标题(title)之间的距离实战
  2. R构建KNN分类器实战
  3. 影像组学视频学习笔记(42)-影像组学特征提取问题解决过程复现、Li‘s have a solution and plan.
  4. R语言数据结构之数据框
  5. luci网页shell_openwrt luci web分析
  6. IBS illustrator for the presentation and visualization of biological sequences 中山大学
  7. Assembly of long, error-prone reads using repeat graphs 使用重复图组装长且容易出错的读操作
  8. 实验七:层叠样式表(二)
  9. Python基础总结(1)
  10. 解决问题:chmod: changing permissions of ‘...‘: Read-only file system和/dev/sda1 is write-protected but ex