boost asio 学习(三)

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=4

本章节为io_service添加任务,并且区分dispatch与post的区别.如果说io_service是asio库的大脑,那么post与dispatch就是asio库的手和脚。

先看看示例1

#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>

boost::mutex global_stream_lock;

void WorkerThread( boost::shared_ptr< boost::asio::io_service > io_service )
{
	global_stream_lock.lock();
	std::cout << "[" << boost::this_thread::get_id()
		<< "] Thread Start" << std::endl;
	global_stream_lock.unlock();

	io_service->run();

	global_stream_lock.lock();
	std::cout << "[" << boost::this_thread::get_id()
		<< "] Thread Finish" << std::endl;
	global_stream_lock.unlock();
}

size_t fib( size_t n )
{
	if ( n <= 1 )
	{
		return n;
	}
	boost::this_thread::sleep(
		boost::posix_time::milliseconds( 1000 )
		);
	return fib( n - 1 ) + fib( n - 2);
}

void CalculateFib( size_t n )
{
	global_stream_lock.lock();
	std::cout << "[" << boost::this_thread::get_id()
		<< "] Now calculating fib( " << n << " ) " << std::endl;
	global_stream_lock.unlock();

	size_t f = fib( n );

	global_stream_lock.lock();
	std::cout << "[" << boost::this_thread::get_id()
		<< "] fib( " << n << " ) = " << f << std::endl;
	global_stream_lock.unlock();
}

int main( int argc, char * argv[] )
{
	boost::shared_ptr< boost::asio::io_service > io_service(
		new boost::asio::io_service
		);
	boost::shared_ptr< boost::asio::io_service::work > work(
		new boost::asio::io_service::work( *io_service )
		);

	global_stream_lock.lock();
	std::cout << "[" << boost::this_thread::get_id()
		<< "] The program will exit when all work has finished."
		<< std::endl;
	global_stream_lock.unlock();

	boost::thread_group worker_threads;
	for( int x = 0; x < 2; ++x )
	{
		worker_threads.create_thread(
			boost::bind( &WorkerThread, io_service )
			);
	}

	io_service->post( boost::bind( CalculateFib, 3 ) );
	io_service->post( boost::bind( CalculateFib, 4 ) );
	io_service->post( boost::bind( CalculateFib, 5 ) );

	work.reset();

	worker_threads.join_all();

	return 0;
}

  代码使用智能指针控制io_service,使用mutex控制各个进程间的输出互斥。work类维持io_service的生命周期, 然后使用post添加执行任务。

在此基础上我们再查看post与dispatch的区别:

post 优先将任务排进处理队列,然后返回,任务会在某个时机被完成。

dispatch会即时请求io_service去调用指定的任务。

示例2

#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>

boost::mutex global_stream_lock;

void WorkerThread( boost::shared_ptr< boost::asio::io_service > io_service )
{
	global_stream_lock.lock();
	std::cout << "[" << boost::this_thread::get_id()
		<< "] Thread Start" << std::endl;
	global_stream_lock.unlock();

	io_service->run();

	global_stream_lock.lock();
	std::cout << "[" << boost::this_thread::get_id()
		<< "] Thread Finish" << std::endl;
	global_stream_lock.unlock();
}

void Dispatch( int x )
{
	global_stream_lock.lock();
	std::cout << "[" <<  boost::this_thread::get_id()  << "] "
		<< __FUNCTION__  << " x = " << x <<  std::endl;
	global_stream_lock.unlock();
}

void Post( int x )
{
	global_stream_lock.lock();
	std::cout << "[" <<  boost::this_thread::get_id()  << "] "
		<< __FUNCTION__  << " x = " << x <<  std::endl;
	global_stream_lock.unlock();
}

void Run3( boost::shared_ptr< boost::asio::io_service > io_service )
{
	for( int x = 0; x < 3; ++x )
	{
		io_service->dispatch( boost::bind( &Dispatch, x * 2 ) );
		io_service->post( boost::bind( &Post, x * 2 + 1 ) );
		boost::this_thread::sleep( boost::posix_time::milliseconds( 1000 ) );
	}
}

int main( int argc, char * argv[] )
{
	boost::shared_ptr< boost::asio::io_service > io_service(
		new boost::asio::io_service
		);
	boost::shared_ptr< boost::asio::io_service::work > work(
		new boost::asio::io_service::work( *io_service )
		);

	global_stream_lock.lock();
	std::cout << "[" <<  boost::this_thread::get_id()
		<< "] The program will exit when all  work has finished." <<  std::endl;
	global_stream_lock.unlock();

	boost::thread_group worker_threads;
	for( int x = 0; x < 1; ++x )
	{
		worker_threads.create_thread( boost::bind( &WorkerThread, io_service ) );
	}

	io_service->post( boost::bind( &Run3, io_service ) );

	work.reset();

	worker_threads.join_all();

	return 0;
}

  我们可以看到结果是先显示dispatch的结果然后才显示post结果,与预想的是一致的.

时间: 2024-10-11 22:46:01

boost asio 学习(三)的相关文章

c++ boost库学习三:实用工具

noncopyable 大家都知道定义一个空类的时候,它实际包含了构造函数,拷贝构造函数,赋值操作符和析构函数等. 这样就很容易产生一个问题,就是当用户调用A a(“^_^") 或者A c="^_^" 时会发生一些意想不到的行为,所以很多时候我们需要禁用这样的用法. 一种方法就是把拷贝构造函数和赋值操作符显式的定义为private,但是这样需要很多代码. 于是boost库为大家提供了一个简单的方法:只需要将类继承于noncopyable就可以了. #include "

boost asio 学习(六) 定时器

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=7 6 定时器 boost::asio 提供了一个 deadline_timer class来提供同步与异步的接口. BOOST文档提供了一组优秀示例.第一个例子,将创建一个间隔5秒的定时器. #include <boost/asio.hpp> #include <boost/shared_ptr.hpp&

boost asio 学习(九) boost::asio 网络封装

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=10 9. A boost::asio network wrapper (TCP) 现在我们了解asio和TCP网络方面的知识,我们可以尝试下封装网络底层.通过使用这个封装,我们可以重用代码并且将精力集中于业务逻 辑方面而不在网络通讯方面花费太多精力. 重要提示:本代码仅仅用于教学目的.不要在商业系统中使用该代码,

boost asio 学习(七) 网络基础 连接器和接收器(TCP示例)

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting- started-with-boostasio?pg=8 7. Networking basics: connectors and acceptors (TCP)我们来学习boost的TCP网络编程.之前的篇章已经介绍了网络系统框架.我们只需要学习网络API函数即可 我们首先学习如何同步的连接主机.我们的代码作为客户端运行,使用tcp::socket对象.tcp::s

boost asio学习笔记 [1] - 同步通讯

本文以一段示例代码,说明使用boost asio进行同步通讯的使用方法. #include <iostream> #include <boost/asio.hpp> using namespace std; using boost::asio::ip::tcp;  int main() {     boost::asio::io_service   ioservice;             // I/O事件模型封装,如win下的iocp,unix下的poll, linux下的e

BOOST ASIO 学习专贴

1.同步使用Timer 本便使用了boost::asio::deadline_timer,这个timer有两种状态:过期和不过期.wait函数调用一个过期的timer直接返回. int _tmain(int argc, _TCHAR* argv[]) { boost::asio::io_service io; boost::asio::deadline_timer t(io,boost::posix_time::seconds(5)); t.wait(); std::cout<<"w

boost asio 学习(五) 错误处理

http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=6 5. Error handling 接下来我们需要注意的话题是错误处理.换句话说就是函数抛出异常时发生了什么 Boost::asio 给予用户两种选择来处理.错误通过handler传播,指出线程呼叫run或者poll系列函数的位置.用户可以能处理通过异常抛出的状态或者是接收返回的错误变量.更多关于BOOST的信息

boost::asio学习(定时器)

#include <boost/asio.hpp> #include <iostream> void handle1(const boost::system::error_code& ec) { std::cout << "5.s" << std::endl; } void handle2(const boost::system::error_code& ec) { std::cout << "10.

Boost.Asio学习笔记一、linux下boost库的安装

学习开源库的第一步就是,编译安装,然后我们才能写一写demo去测试. 所以本章我们学一下在linux编译安装Boost库,为了方便起见,直接安装完整库. 我使用的版本是boost_1_55_0,版本差别不大. [[email protected] ~]$ tar -zxvf boost_1_55_0.tar.gz [[email protected] boost_1_55_0]$ ./bootstrap.sh --prefix=/home/mjf/lib [[email protected] b