C++ 在较新的编译器中使用std::async的默认启动策略是否更好?

C++ 在较新的编译器中使用std::async的默认启动策略是否更好?,c++,c++11,asynchronous,C++,C++11,Asynchronous,众所周知,使用std::async时,默认启动策略可能会导致延迟执行。例如,见 在gcc 5.2.0中使用MinGW-W64时,我在这里看到了这种行为。因此,我已经习惯于将std::launch::async作为启动策略传递 但最近我意识到新的gcc版本表现不同。在使用MinGW-W64和g++8.1.0时,省略std::async启动策略也会导致在上面链接的示例代码中异步执行。因此,我再也看不到std::async启动策略的明显优势 Scott Meyer的“有效的现代C++”的第35条似乎暗

众所周知,使用
std::async
时,默认启动策略可能会导致延迟执行。例如,见

在gcc 5.2.0中使用MinGW-W64时,我在这里看到了这种行为。因此,我已经习惯于将
std::launch::async
作为启动策略传递

但最近我意识到新的gcc版本表现不同。在使用MinGW-W64和g++8.1.0时,省略
std::async
启动策略也会导致在上面链接的示例代码中异步执行。因此,我再也看不到
std::async
启动策略的明显优势

Scott Meyer的“有效的现代C++”的第35条似乎暗示默认的LoCH策略可能会阻止线程异常,或者如果C++标准库实现了合理的线程调度程序,则会导致更好的负载平衡。
是这样吗?因此,我是否应该习惯于坚持默认的启动策略?这是所有(相对较新的)C++编译器的一般建议吗?

这当然是意图,但是因为一些实现的默认行为总是回落到<>代码STD::Apdio::推迟的(它们被允许做)它们会对其他的人造成破坏。如果您真的想要异步执行(如果函数被延迟,那么代码会出现错误)并且您真的想要可移植代码,那么除了指定
std::launch::async
之外,您别无选择。如果是“理想情况下,这将是异步的”,但如果不是,则不会中断,您可以保留默认的启动策略。@FrançoisAndrieux“平台”是什么意思?编译器?标准库?还是操作系统?我认为值得注意的是,目前标准的
std::async
完全被破坏了,因为它实际上阻止了线程池的使用AFAIK@Mgetz你能给我介绍一下你提到的
thread\u local
问题吗?我的谷歌技能让我失望。@FrançoisAndrieux有几个博客,但这让它变得最清晰。TL;博士该标准要求运行
std::async
任务的环境,就像没有其他
std::async
任务在同一线程中运行一样。这与
thread\u local
修饰符的交互非常糟糕。这当然是故意的,但是由于一些实现的默认行为总是回到
std::launch::deferred
(允许它们这么做),它们会破坏其他实现。如果您真的想要异步执行(如果函数被延迟,那么代码会出现错误)并且您真的想要可移植代码,那么除了指定
std::launch::async
之外,您别无选择。如果是“理想情况下,这将是异步的”,但如果不是,则不会中断,您可以保留默认的启动策略。@FrançoisAndrieux“平台”是什么意思?编译器?标准库?还是操作系统?我认为值得注意的是,目前标准的
std::async
完全被破坏了,因为它实际上阻止了线程池的使用AFAIK@Mgetz你能给我介绍一下你提到的
thread\u local
问题吗?我的谷歌技能让我失望。@FrançoisAndrieux有几个博客,但这让它变得最清晰。TL;博士该标准要求运行
std::async
任务的环境,就像没有其他
std::async
任务在同一线程中运行一样。这与
thread\u local
修饰符的交互非常糟糕。