zoukankan      html  css  js  c++  java
  • 在不使用显式锁的方式下使用多线程

    一个串被定义为序列的调用事件句柄(非并行调用),使用串允许在多线程环境中执行代码而不使用显示的互斥锁。
    串可以是隐式的或者显式的,如下方的可替代方法所示:
    仅在一个线程中调用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。
  • 相关阅读:
    Codeforces 787D. Legacy 线段树优化建图+最短路
    Codeforces 1051E. Vasya and Big Integers
    BZOJ3261 最大异或和
    BZOJ3531 SDOI2014 旅行
    洛谷P2468 SDOI 2010 粟粟的书架
    2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat
    HDU6280 From Tree to Graph
    HDU5985 Lucky Coins 概率dp
    (HDU)1334 -- Perfect Cubes (完美立方)
    (HDU)1330 -- Deck (覆盖物)
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/5270908.html
Copyright © 2011-2022 走看看