- 主题:std::async() 为何要有 deferred 这种模式
std::async 不是半残吗?真有人用在生产环境中?
【 在 alewa 的大作中提到: 】
: std::async() 的两种启动模式,std::launch::async 和 std::launch::deferred。看书上说,deferred 模式下,在当前线程里启动,而且直到 future.get() 时才真正运行任务,并 block 直到任务完成、得到结果。
: 如果这样,为啥不直接在原来调用 future.get() 的地方直接 do_work() 呢?好像跟上述 deferred 模式下效果是一样的。deferred 还有啥好处吗?
: 谢谢!
--
FROM 218.76.62.*
各个平台实现不一样。。
好像 WINDOWS 还是 LINUX 平台下,每次调用都会开启一个线程。。
如果是一个执行频繁并且执行过程比较长的调用,会导致最后有几千个线程。
我们的系统会调用外部的一个 webhook,当时偷懒就用了这个来做,,结果系统开了几千个线程,啥都没干了,全花在线程上下文切换上了。
【 在 z16166 的大作中提到: 】
: 半残在什么部位?哈哈
:
--
FROM 218.76.62.*
下面是一个线程池。
【 在 TheMachine 的大作中提到: 】
: 你预期std::async是啥行为
: - 来自 水木社区APP v3.5.7
--
FROM 222.247.67.*
我需要就是把任务用 std::async 无脑发出去。。底层的线程池自己排队处理,再给我一个接口用来设置线程池数量,再设置一下每个异步的超时时间。。
【 在 z16166 的大作中提到: 】
: 如果有人写的代码把线程池里的线程全都block了,那你会得到另外一个shock。
: 也就是说,你得到你那个几千个线程的shock的原因,是你(们)的代码自己提交了几千个任务导致的,不能甩锅给库,就好比自己失误创建了几千个线程,但是甩锅给CreateThread()或者pthread_create()一样
:
--
FROM 218.76.62.*
有 BUG 就修。
【 在 z16166 的大作中提到: 】
: 同样可能存在问题,比如某人写的异步任务代码在cancel/timeout的实现上有bug,一样可能会卡死所有人的任务
: 这不能赖线程池的库。
:
--
FROM 218.76.62.*