往往我们开发出来的产品,都是运行在不同的国家,不同的地区,不同生活水平的用户,因而软件产品会运行在不同的环境的电脑里。比如富裕国家里的电脑硬件资源,都比较好,如果还是按低配置电脑的水平设计,显示不会满足用户的要求。但是按高配置要求的硬件资源来设计,行吗?也不行,比如软件安装到工厂这样节约资源的电脑硬件资源里,就会运行不起来,或者说不流畅。因此,在设计软件产品时,需要动态适应电脑运行环境,或者根据电脑当前的情况来运态修改。比如当用户正在操作时,减少后台任务的运行,当用户不操作时,再增加后台任务的运行。这样,就会显著地改变用户对软件的操作体验。软件开发人员想更容易、方便地解决这些问题,可以使用线程池的方式来运行任务队列来解决,当需要减少占用CPU时,就挂起一些线程,当CPU空闲时,就恢复线程的运行。
从前面已经学习过线程池,只需要把线程池添加到任务队列里,就可以实现这个功能了,例子如下:// boost_015.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;
}
//封装线程组运行的类, 并且演示使用类成员函数作为线程组运行函数
class CThreadBase
{
public:
CThreadBase(void)
:m_Work(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();
}
//测试任务队列
void TestTask(void)
{
//放入几个任务。
m_ioService.post(boost::bind(TaskRun, 10));
m_ioService.post(boost::bind(TaskRun, 2));
m_ioService.post(boost::bind(TaskRun, 88));
m_ioService.post(boost::bind(TaskRun, 99));
m_ioService.post(boost::bind(TaskRun, 888));
m_ioService.post(boost::bind(TaskRun, 1314520));
}
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;
};
int _tmain(int argc, _TCHAR* argv[])
{
//
CThreadBase threadBase;
//设置最大的线程个数。
threadBase.Start(3);
threadBase.TestTask();
Sleep(2000);
threadBase.Stop();
system("pause");
return 0;
}