当前位置: 首页 > news >正文

有没有专门做图的网站如何提高网站点击率

有没有专门做图的网站,如何提高网站点击率,wordpress文章内容,合肥免费招聘网站有栈协程和无栈协程 有栈协程和无栈协程 实现一个协程的关键点在于如何保存、恢复和切换上下文#xff0c;而这也是有栈协程和无栈协程的主要区别。有栈协程通过直接切换堆栈来实现#xff0c;其构造了一个内存中的栈#xff0c;而无栈协程使用状态机按需分配的方式#x…有栈协程和无栈协程 有栈协程和无栈协程 实现一个协程的关键点在于如何保存、恢复和切换上下文而这也是有栈协程和无栈协程的主要区别。有栈协程通过直接切换堆栈来实现其构造了一个内存中的栈而无栈协程使用状态机按需分配的方式为所用到的变量开设临时内存但是实现逻辑更加复杂。 两者各有利弊只能说无栈的内存利用率更高而不能说无栈就一定比有栈好。 避免内存分配 异步操作需要有一个地方用来存储一些对当前操作进度的跟踪此状态需要一直保持直到操作完成后才能释放。这一点很好理解孩子出门读大学总得知道家在哪儿还要回家的。 例子-一个简易的线程同步的例子 关于如何使用协程实现一个简单得到线程同步以下是一个原文中的例子异步手动重置事件。 此事件的基本要求是它需要被多个并发执行的协程等待等待时需要挂起等待的协程直到某个线程调用.set()方法此时任何等待的协程都被恢复。如果某个线程已经调用了.set()那么协程应该继续而不挂起。 消费者生产者模型 T value; async_manual_reset_event event;// A single call to produce a value void producer() {value some_long_running_computation();// Publish the value by setting the event.event.set(); }// Supports multiple concurrent consumers task consumer() {// Wait until the event is signalled by call to event.set()// in the producer() function.co_await event;// Now its safe to consume value// This is guaranteed to happen after assignment to valuestd::cout value std::endl; }上述的例子是典型的生产者-消费者模型的异步实现消费者需要保证在等待生产者完成生产也就是完成value some_long_running_computation();这一步操作前不能消费value需要确保一个顺序问题。 正如上文所述无栈协程需要状态机来记录当前状态比如这个event就有两种状态set和not set。当处于set状态时没有正在等待的协程co_await操作可以继续进行而非挂起。当处于not set的状态时将会有一批正在等待的协程等着变成set状态这一批协程的数量可能为0。 该状态可以用一个简单的std::atomicvoid*来代表。 我们可以通过在coroutine frame中通过存储awaiter对象来避免在堆上进行额外存储。下面这个例子将说明如何实现 简单的接口 class async_manual_reset_event { public:async_manual_reset_event(bool initiallySet false) noexcept;// No copying/movingasync_manual_reset_event(const async_manual_reset_event) delete;async_manual_reset_event(async_manual_reset_event) delete;async_manual_reset_event operator(const async_manual_reset_event) delete;async_manual_reset_event operator(async_manual_reset_event) delete;bool is_set() const noexcept;struct awaiter;awaiter operator co_await() const noexcept;void set() noexcept;void reset() noexcept;private:friend struct awaiter;// - this set state// - otherwise not set, head of linked list of awaiter*.mutable std::atomicvoid* m_state;};显然这个接口足够直接且简单但是这里还需要注意的是此处尚未定义awaiter接下来就来定义awaiter结构体。 定义awaiter 需要通过初始化来确定哪一个async_manual_reset_event对象会被等待。需要以链表的形式来存储awaiter的值。需要存储正在等待的协程的coroutine handle因此这个事件可以当他切换到‘set’状态时可以恢复协程。需要可以应用Awaiter的接口因此其需要三个特别的方法await_ready,await_suspend,await_resume。 一旦我们将这些全都放到一起基本的接口如下所示 struct async_manual_reset_event::awaiter {awaiter(const async_manual_reset_event event) noexcept: m_event(event){}bool await_ready() const noexcept;bool await_suspend(std::experimental::coroutine_handle awaitingCoroutine) noexcept;void await_resume() noexcept {}private:const async_manual_reset_event m_event;std::experimental::coroutine_handle m_awaitingCoroutine;awaiter* m_next; };由于协程是否暂停取决于event的状态是否为set所以还需要进行判断 bool async_manual_reset_event::awaiter::await_ready() const noexcept {return m_event.is_set(); }await_suspend await_suspend才是awaitable类型中最重要的部分这一节主要讲述其用法和所需要注意的部分。 在m_awaitingCoroutine 中暂存正在等待的协程的协程句柄以供恢复操作。 bool async_manual_reset_event::awaiter::await_suspend(std::experimental::coroutine_handle awaitingCoroutine) noexcept {// Special m_state value that indicates the event is in the set state.const void* const setState m_event;// Remember the handle of the awaiting coroutine.m_awaitingCoroutine awaitingCoroutine;// Try to atomically push this awaiter onto the front of the list.void* oldValue m_event.m_state.load(std::memory_order_acquire);do{// Resume immediately if already in set state.if (oldValue setState) return false; // Update linked list to point at current head.m_next static_castawaiter*(oldValue);// Finally, try to swap the old list head, inserting this awaiter// as the new list head.} while (!m_event.m_state.compare_exchange_weak(oldValue,this,std::memory_order_release,std::memory_order_acquire));// Successfully enqueued. Remain suspended.return true; }注意我们需要在加载旧状态的时候去获取内存顺序 event类的剩余部分 既然我们已经定义完了awaiter类型让我们重新看一看async_manual_reset_event的应用。 构造。需要进行初始化‘not set’nullptr或者‘set’this async_manual_reset_event::async_manual_reset_event(bool initiallySet) noexcept : m_state(initiallySet ? this : nullptr) {}is_set(),判断是否为‘set’ bool async_manual_reset_event::is_set() const noexcept {return m_state.load(std::memory_order_acquire) this; }reset(), 如果是‘set’则切换到‘not set’状态反之则置之不理 void async_manual_reset_event::reset() noexcept {void* oldValue this;m_state.compare_exchange_strong(oldValue, nullptr, std::memory_order_acquire); }set()希望通过交换当前状态和特殊的“set”值this来转换到“set”状态然后检查旧值是什么。如果有任何等待的协程那么我们希望在返回之前依次恢复每个协程。 void async_manual_reset_event::set() noexcept {// Needs to be release so that subsequent co_await has// visibility of our prior writes.// Needs to be acquire so that we have visibility of prior// writes by awaiting coroutines.void* oldValue m_state.exchange(this, std::memory_order_acq_rel);if (oldValue ! this){// Wasnt already in set state.// Treat old value as head of a linked-list of waiters// which we have now acquired and need to resume.auto* waiters static_castawaiter*(oldValue);while (waiters ! nullptr){// Read m_next before resuming the coroutine as resuming// the coroutine will likely destroy the awaiter object.auto* next waiters-m_next;waiters-m_awaitingCoroutine.resume();waiters next;}} }最后一步应用co_await()操作。只需要构造一个awaiter对象。 async_manual_reset_event::awaiter async_manual_reset_event::operator co_await() const noexcept {return awaiter{ *this }; }综上我们现在获得了一个可等待的异步手动重置事件并且是lock-freememory-allocation-free的应用。 这文章有点长感觉理解还有所欠缺回头会继续精进的感谢阅读~
http://www.pierceye.com/news/571668/

相关文章:

  • 常熟网站建设icp备案自己怎样创建网站
  • 移动互联网站建设seo流量排名门户
  • 做腰椎核磁证网站是 收 七设计网络品牌营销方案思路
  • 外贸网站建站系统基于php网站开发
  • 可以做代销的网站都有哪些神马网站快速排名案例
  • 个人能申请网站吗百度站长提交网址
  • 给素材网站做签约设计不想做了网络规划设计师教程第2版pdf
  • 新做的网站怎样推广html代码加密
  • 织梦淘宝客网站嘉兴网站开发公司
  • 宁波网站推广营销网上购物软件哪个好
  • 网站 风格做网站都可以做什么
  • 网站的建设公司简介现在建站好么
  • 简述电子商务网站建设流程wordpress极速优化
  • 移动网站怎么做万维设计
  • 建设网站我们重中之重-用户体验企业网站模板 首页大图
  • 怎么在本地做网站wordpress 建表
  • wordpress整站数据网站设计公司排名
  • 常州建设局网站海南网站建设报价方案
  • 做网站流量怎么解决广州热点新闻
  • 浙江省网站icp备案网页设计大赛海报
  • 做传奇开服一条龙网站哪个好学计算机网站建设
  • 商城网站素材wordpress影视解析插件
  • 昆明市住房和城乡建设局门户网站如何做自己官方网站
  • 微网站官网室内设计平面图素材
  • 国外做袜靴的网站wordpress在后台文章自定义表单
  • 网站商城建设实训心得优质校建设网站
  • 皖icp网站建设专业建设存在问题及改进建议
  • 建设网银登录网站wordpress怎么删除目录下
  • 网站建设帖子微信附近人推广引流
  • 苏州建网站要多少钱龙岩推广公司