一个串被定义为序列的调用事件句柄(非并行调用),使用串允许在多线程环境中执行代码而不使用显示的互斥锁。
串可以是隐式的或者显式的,如下方的可替代方法所示:
仅在一个线程中调用io_service::run()意味着使用隐式的串执行所有的事件句柄,因为io_service确保了句柄只被run()内部调用。
当有一个只和一个连接关联的异步操作链时(比如半双工的协议HTTP),不可能并发的执行句柄,这是一个隐式的串。
显式的串调用是一个io_service::strand的实例,所有的事件句柄函数需要使用io_service::strand::wrap()包装,或者通过io_service::strand对象进行通告、发送。
如果是异步操作,比如async_read()或者async_read_until(),如果一个完成句柄通过一个strand,所有其他的中间句柄也都需要通过同一个串,这是为了保证在调用者和完成操作之间共享的对象的线程安全(在async_read() 的情况下是socket,调用者可以通过close来关闭操作),这是通过给所有指向同最终句柄关联的自定义句柄的中间对象嵌入hook函数来完成的。
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来执行。
串的英文为strand。