gpt4 book ai didi

c++ - 长时间运行的 std::async 会饿死其他 std::async 吗?

转载 作者:太空狗 更新时间:2023-10-29 21:34:11 25 4
gpt4 key购买 nike

据我了解,std::async 的通常实现会在来自预分配线程池的线程上安排这些作业。

假设我首先创建并安排足够长时间运行的 std::async 以保持该线程池中的所有线程都被占用。紧接着(在他们完成执行之前不久)我还创建并安排了一些短期运行的 std::async。会不会发生短期运行的程序在至少一个长期运行的程序完成之前根本不执行的情况?或者在标准(特别是 C++11)中是否有一些保证可以防止这种情况(比如产生更多的线程,以便操作系统可以以循环方式调度它们)?

最佳答案

标准如下:

[futures.async#3.1] If launch​::​async is set in policy, calls INVOKE(DECAY_­COPY(std​::​forward<F>(f)), DECAY_­COPY(std​::​forward<Args>(args))...) ([func.require], [thread.thread.constr]) as if in a new thread of execution represented by a thread object with the calls to DECAY_­COPY being evaluated in the thread that called async.[...]

因此,根据as-if 规则, 线程必须在async() 时产生。用 ​async 调用启动政策。当然,一个实现可能会在内部使用线程池,但是除了通常的线程创建开销之外,不会发生特殊的“饥饿”。此外,诸如线程局部变量初始化之类的事情应该始终发生。

其实clang libc++ trunk async implementation是这样写的:

unique_ptr<__async_assoc_state<_Rp, _Fp>, __release_shared_count>
__h(new __async_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));

VSTD::thread(&__async_assoc_state<_Rp, _Fp>::__execute, __h.get()).detach();

return future<_Rp>(__h.get());

如您所见,内部没有使用“显式”线程池。

此外,如您所见here gcc 5.4.0 附带的 libstdc++ 实现也只是调用一个普通线程。

关于c++ - 长时间运行的 std::async 会饿死其他 std::async 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47573564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com