添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

为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 &lt;boost/asio.hpp&gt;#include &lt;boost/shared_ptr.hpp&gt;#include &lt;boost/thread.hpp&gt;...
本文为读《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的状态管理库,它为应用程序的组件提供了一个全局的状态存储。在Vuexdispatch和commit是用来更新状态的两种方式。 `dispatch`是用来触发状态更新的,它会调用状态管理器的actions。 `commit`是用来提交状态变更的,它会调用状态管理器的mutations。 总的来说,dispatch用来触发异步操作,commit用来提交同步操作。