Strands:使用无显式锁的线程

strands(译者注:该单词未找到确切范例翻译,故保留英文原词)被定义为一种严格按照时序调用事件的(换言之,没有current invocation这样的用法)。strands的在多线程的使用中允许用户不使用显式锁(例如mutexes)。

strands既可以是显式的也可以是隐式的,通过以下几种备选方案实现:

  • 只在一个线程中调用io_service::run(),表明所有事件发生在一个隐式的strand中,在io_service的保证下,所有的回调只会在内部的run中被调用。
  • 在一个由单一连接形成的,异步操作的,单链中(例如:在一个半双工连接中,比如HTTP),不可能有并行的事件,这也是一个隐式的strand。
  • io_service::strand是显式的strand。所有的事件需要被io_service::strand::wrap()所包装或者使用io_service::strand对象来分发。

在组合过的异步操作中,就像async_read()或者async_read_until()。如果一个事件回调由一个strand执行,那么所有的中间环节都应该使用strand。这样才能保证线程安全,所有的对象在调用者和组合操作中都是安全的(例如在async_read()中,这是个socket,调用者可以使用close()来取消操作)。这种行为通过在所有中间操作的末尾添加定制的钩子函数来实现:

struct my_handler
{
    void operator()() {...}
};

template<class F>
void asio_handler_invoke(F f, my_handler*)
{
    // Do custom invocation here.
    // Default implementation calls f();
}

被io_service::strand::wrap()包装过的函数被定义为asio_handler_invoke,这样这些函数对象就都在strand中执行了。

参见

io_service::strand,tutorial Timer5,HTTP server 3 example。

results matching ""

    No results matching ""