博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
boost库在工作(23)任务之三
阅读量:4162 次
发布时间:2019-05-26

本文共 2566 字,大约阅读时间需要 8 分钟。

在前面的多任务执行里,因为有多个线程执行,只要放到任务队列里的任务都会执行,但这些任务执行顺序是随机的,没有固定的顺序,也就是说放入队列早的任务不一定就是早执行,放入队列迟的任务也不一定后执行。这样没有顺序的执行性是多线程的本来特性,虽然可以使用锁对象来同步一个对象不被多个线程同时访问,但它是没有办法确保任务之间的有序访问同一个资源。这时,就需要引入一个对象
io_service::strand
,有它来保证放入任务队列的任务,可以按它放入任务队列的顺序来执行。比如使用一个线程池来执行写多个文件,每一个文件都是有序的数据,而多个文件之间是无序的,这样在每一个文件都使用
io_service::strand
放入,而多个
io_service::strand
对象之间是无序的,这样确保每一个文件写是有序队列,而多个文件可以无序执行,达到最大性能地使用
CPU
资源。如下面的例子:
// boost_016.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include 
#include
#include
#include
#include
void TaskRun(int nVal){ //下面输出需要加锁,不能多个线程共享输出。 static boost::mutex mutexCout; boost::lock_guard
autoLock(mutexCout); std::cout << "TaskRun: " << nVal << std::endl;}//封装线程组运行的类, 并且演示使用类成员函数作为线程组运行函数class CThreadBase{public: CThreadBase(void) :m_Work(m_ioService), m_Strand(m_ioService) { } void Start(int nMaxCount) { //循环地创建N个线程。 for (int i = 0; i < nMaxCount; ++i) { m_threadGroup.create_thread(boost::bind(&CThreadBase::Run, this, i)); } } void Stop(void) { // m_ioService.stop(); //等所有线程退出。 m_threadGroup.join_all(); } //测试任务队列 //软件开发人员: 蔡军生 2013-04-28 //QQ: 9073204 void TestTask(void) { //放入几个任务。 m_ioService.post(boost::bind(TaskRun, 1)); m_ioService.post(boost::bind(TaskRun, 2)); m_ioService.post(boost::bind(TaskRun, 3)); m_ioService.post(boost::bind(TaskRun, 4)); m_ioService.post(boost::bind(TaskRun, 5)); m_ioService.post(boost::bind(TaskRun, 6)); } //测试有序任务队列 void TestStrandTask(void) { //放入几个任务。 m_Strand.post(boost::bind(TaskRun, 1)); m_Strand.post(boost::bind(TaskRun, 2)); m_Strand.post(boost::bind(TaskRun, 3)); m_Strand.post(boost::bind(TaskRun, 4)); m_Strand.post(boost::bind(TaskRun, 5)); m_Strand.post(boost::bind(TaskRun, 6)); }private: virtual void Run(int nVal) { //运行队列里的任务。 boost::system::error_code errorCode; m_ioService.run(errorCode); }private: //定义一个任务队列。 boost::asio::io_service m_ioService; boost::asio::io_service::work m_Work; //定义一个线程组对象。 boost::thread_group m_threadGroup; //按顺序执行的对象。 boost::asio::io_service::strand m_Strand;};int _tmain(int argc, _TCHAR* argv[]){ // CThreadBase threadBase; //设置最大的线程个数。 threadBase.Start(3); threadBase.TestTask(); Sleep(2000); std::cout << "TestStrandTask: " << std::endl; threadBase.TestStrandTask(); Sleep(2000); threadBase.Stop(); system("pause"); return 0;}

这是运行上面例子执行的结果:

TaskRun: 2

TaskRun: 4

TaskRun: 3

TaskRun: 1

TaskRun: 5

TaskRun: 6

TestStrandTask:

TaskRun: 1

TaskRun: 2

TaskRun: 3

TaskRun: 4

TaskRun: 5

TaskRun: 6

请按任意键继续. . .

从这个结果可以看到第一部份是无序执行的输出,最后一部份是有序执行。

转载地址:http://gaixi.baihongyu.com/

你可能感兴趣的文章
android系统提供的常用命令行工具
查看>>
【Python基础1】变量和字符串定义
查看>>
【Python基础2】python字符串方法及格式设置
查看>>
【Python】random生成随机数
查看>>
【Python基础3】数字类型与常用运算
查看>>
【Python基础4】for循环、while循环与if分支
查看>>
【Python基础6】格式化字符串
查看>>
【Python基础7】字典
查看>>
【Python基础8】函数参数
查看>>
【Python基础9】浅谈深浅拷贝及变量赋值
查看>>
Jenkins定制一个具有筛选功能的列表视图
查看>>
【Python基础10】探索模块
查看>>
【Python】将txt文件转换为html
查看>>
[Linux]Shell脚本实现按照模块信息拆分文件内容
查看>>
idea添加gradle模块报错The project is already registered
查看>>
在C++中如何实现模板函数的外部调用
查看>>
在C++中,关键字explicit有什么作用
查看>>
C++中异常的处理方法以及使用了哪些关键字
查看>>
内存分配的形式有哪些? C++
查看>>
什么是内存泄露,如何避免内存泄露 C++
查看>>