为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去调用指定的任务。
#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结果,与预想的是一致的.
为io_service添加任务,并且区分dispatch与post的区别.如果说io_service是asio库的大脑,那么post与dispatch就是asio库的手和脚。先看看示例1#include <boost/asio.hpp>#include <boost/shared_ptr.hpp>#include <boost/thread.hpp>...
本文为读《ConcurrencyProgrammingGuide》笔记第二篇,在上篇分享了OSX和iOS应用开发中实现任务异步执行的技术以及应注意的事项之后,作者付宇轩)对Operation对象的设置与执行,以及DispatchQueues的创建与管理进行了实践总结。Operation对象除了上文中讲到到基本使用方法外还有一些其他的特性,这些特性需要根据我们的应用场景去设置,设置的时机在创建Operation对象之后和运行它或者将其放入操作队列之前,下面让我们来看看Operation对象还有哪些特性。与GCD不同,OperationQueue不遵循先进先出的原则,而且OperationQueu
Windows 实现了一个由优先级驱动,抢占式的调度系统,调度过程结合实践配额调整,调度单位是线程。Windows 在单处理机系统和多处理机系统中的线程调度是不同的。
Windows采用多优先级队列,windows为每个优先级的线程都准备了优先级队列,同一优先级各线程按时间片轮转进行调度,多处理器可以多线程并行。
Windows没有单独的调度模块或程序,调度的代码是在内核中实现的,广泛分布在内核中那些与调度相关的事件发生的地方。这些负责调度的程序被总称为“内核的调度器”。线程调度发生在DPC/Dispatch级别。
post()会将Handler加入到任务队列中,然后在调用了run()、run_one()、 poll()、 poll_one()的线程中执行。
dispatch()会先进行判断,如果执行dispatch的线程之后就会调用run()、run_one()、 poll()、 poll_one(),那么直接在当前线程执行。否则同post()。
官方解释如下:
io_service::post
Reque...
Asio中的异步操作不仅包括 异步的客户端服务端的连接和异步的数据读写,还包括很多可以异步执行的操作。
Asio中有三种方式异步执行你指定的方法:post()、dispach()、wrap()。
post()这个方法能立即返回,并且请求一个io_service实例调用制定的函数操作(function handler),之后会在某一个盗用io_service.run()的线程中执行。
dispach
asio基于前摄器模式(Proactor)封装了操作系统的select、poll、epoll、kqueue等机制,实现了异步IO模型。它的核心类是io_server,相当于前摄器模式中的Proactor。asio的任何操作都需要io_server的参与。
在同步模式下,程序发起一个IO操作,向io_server提交请求,io_server把操作转交给操作系统,同步的等待。当IO操作完成之后,操作系统通知io_server,然后io_server在把结果发回给程序,完成整个同步过程。类型多线程的joi
Vuex是Vue.js的状态管理库,它为应用程序中的组件提供了一个全局的状态存储。在Vuex中,dispatch和commit是用来更新状态的两种方式。
`dispatch`是用来触发状态更新的,它会调用状态管理器中的actions。
`commit`是用来提交状态变更的,它会调用状态管理器中的mutations。
总的来说,dispatch用来触发异步操作,commit用来提交同步操作。