zoukankan      html  css  js  c++  java
  • 执行线程boost库在工作(23)任务之三

    查了好多资料,发现还是不全,干脆自己整理吧,至少保障在我的做法正确的,以免误导读者,也是给自己做个记录吧!

        在前面的多任务执行里,因为有多个线程执行,只要放到任务队列里的任务都市执行,但这些任务执行顺序是随机的,没有固定的顺序,也就是说放入队列早的任务不一定就是早执行,放入队列迟的任务也不一定后执行。这样没有顺序的执行性是多线程的本来特性,虽然可以应用锁对象来同步一个对象不被多个线程同时拜访,但它是没有办法确保任务之间的有序拜访同一个资源。这时,就须要引入一个对象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 <boost/asio.hpp>
    #include <boost/bind.hpp>
    #include <boost/thread.hpp>
    #include <boost/thread/mutex.hpp>
    #include <iostream>
    
    void TaskRun(int nVal)
    {
    	//上面输出须要加锁,不能多个线程共享输出。
    	static boost::mutex mutexCout;
    	boost::lock_guard<boost::mutex> autoLock(mutexCout);
    	std::cout << "TaskRun: " << nVal << std::endl;
    }
    
    //封装线程组运行的类, 并且演示应用类成员函数作为线程组运行函数
    //软件开发人员: 蔡军生  2013-05-12
    //QQ: 9073204
    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));	
    	}
    
    	//测试有序任务队列
    	//软件开发人员: 蔡军生  2013-05-12
    	//QQ: 9073204
    	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

        请按任意键继承. . .

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

    文章结束给大家分享下程序员的一些笑话语录: Borland说我很有前途,Sun笑了;Sun说我很有钱,IBM笑了;IBM说我很专业,Sybase笑了;Sybase说我数据库很牛,Oracle笑了;Oracle说我是开放的,Linux笑了;Linux说我要打败Unix,微软笑了;微软说我的系统很稳定,我们都笑了。

  • 相关阅读:
    mac下webstorm自动编译typescript配置
    [转]Golang 中使用 JSON 的小技巧
    Element-UI 框架 el-scrollbar 组件
    npm读取config配置的优先级(yarn同理)
    win, mac, linux 默认系统缓存目录
    yum离线安装rpm包
    常见网络摄像机(摄像头)的端口及RTSP地址
    sed命令在mac和linux下的区别
    canvas笔记备忘
    shell脚本:批量修改文件名(添加/删除文件名中字符)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3074820.html
Copyright © 2011-2022 走看看