- 主题:std::async() 为何要有 deferred 这种模式
有 BUG 就修。
【 在 z16166 的大作中提到: 】
: 同样可能存在问题,比如某人写的异步任务代码在cancel/timeout的实现上有bug,一样可能会卡死所有人的任务
: 这不能赖线程池的库。
:
--
FROM 218.76.62.*
线程池的异步操作,是个大问题,提供的半成品异步工具,协调起来很困难。
我有线程池,你为啥要开新的,用我的线程不行吗?
【 在 speedboy2998 的大作中提到: 】
: 各个平台实现不一样。。
: 好像 WINDOWS 还是 LINUX 平台下,每次调用都会开启一个线程。。
: 如果是一个执行频繁并且执行过程比较长的调用,会导致最后有几千个线程。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
线程池,异步,协程,我干成了,有体会,可以交流。
我猜你在做一个大并发的服务器。
这种东西是以线程池为基础的,以事件机制作为调度器,我是用epoll,所有工作线程都在等待epoll分配工作。
当一个事件被激活,就有一个线程抓住了这个任务。之后需要IO。同步呢?异步呢?都有需求。这个线程就需要调用一些工具来解决IO问题。因为已经是在线程里了,所以这个工具不应该再管线程的事,这种多管闲事的工具就别用了,找一个纯粹干活的就行。
我用过回调函数的异步,最后还是用协程异步比较好,可以以同步的方式进行异步操作,IO需要等待时就yield,线程跑掉为别人服务,这个任务挂起在epoll,直到具备IO条件被激活。
https://www.newsmth.net/nForum/#!article/CPlusPlus/433004
这个帖对其中存在的问题有详细讨论。
【 在 speedboy2998 的大作中提到: 】
: 下面是一个线程池。
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
这个半残应该是说std::async返回的future必须绑定到一个左值?
就是说,如果你:
std::async(do_something, xxx); // 丢弃返回值
这一句其实和没用async一样,block执行在这一句,要等do_something结束才能到下一句?
所以std::future::~future()在c++14里面专门有一句:
These actions will not block for the shared state to become ready, except that they may block if all following conditions are satisfied:
The shared state was created by a call to std::async. <---
The shared state is not yet ready.
The current object was the last reference to the shared state.
至于实现,实现的不好是另一个问题。
【 在 speedboy2998 的大作中提到: 】
: 各个平台实现不一样。。
: 好像 WINDOWS 还是 LINUX 平台下,每次调用都会开启一个线程。。
: 如果是一个执行频繁并且执行过程比较长的调用,会导致最后有几千个线程。
: ...................
--
FROM 171.95.230.*