首页 文章

strand asio中有什么优势?

提问于
浏览
11

据我所知,学习提升asio并找出一个叫做“strand”的课程 . 如果只有一个io_service与特定链相关联并通过strand发布句柄 .

示例(来自here

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 )
);
boost::asio::io_service::strand strand( *io_service );

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

boost::this_thread::sleep( boost::posix_time::milliseconds( 1000 ) );

strand.post( boost::bind( &PrintNum, 1 ) );
strand.post( boost::bind( &PrintNum, 2 ) );
strand.post( boost::bind( &PrintNum, 3 ) );
strand.post( boost::bind( &PrintNum, 4 ) );
strand.post( boost::bind( &PrintNum, 5 ) );

然后,strand会为我们序列化处理程序执行 . 但是这样做的好处是什么呢?为什么我们不想创建一个单独的线程(例如:for循环中的make x = 1),如果我们希望任务被序列化?

1 回答

  • 23

    可以想象一个系统,其中单个 io_service 管理数百个网络连接的套接字 . 为了能够并行化工作负载,系统维护一个调用 io_service::run 的工作线程池 .

    现在,这种系统中的大多数操作都可以并行运行 . 但有些必须被序列化 . 例如,您可能不希望同一个套接字上的多个写操作同时发生 . 然后,您将使用每个套接字一个链来同步写入:不同套接字上的写入仍然可以同时发生,而对相同套接字的写入将被序列化 . 工作线程不必关心同步或不同的套接字,它们只是 grab 它们的任何东西 .

    有人可能会问:为什么我们不能只使用互斥来代替同步? strand的优点是,如果已经处理了strand,则工作线程将不会首先被调度 . 使用互斥锁,工作线程将获得回调,然后阻止锁定尝试,阻止线程执行任何有用的工作,直到互斥锁变为可用 .

相关问题