C++语,在过去几年里又重新兴起.就个人而言,我认为这有几个原因。嵌入式编程和IoT 设备在过去几年中已成为更通用的开发目标 C++,随着标准库和整体语言语法功能(得益于 auto!此外,使用泛型类型的编程已变得更加常见,使C++模板对于刚入门的模板更容易理解。
您可能还喜欢:我们如何控制/计划执行C、C++中的线程?
标准库中的关键改进之一是基于任务的编程。我们永远拥有线程支持,但基于任务的编程在过去几年中不断发展。此时,您有一个健壮的基于任务的选项,带有std::async()。你应该用它!它坚固、设计良好且性能良好。除非你不该你怎么会知道?
st::异步实现。因此,std::async(.)首先不能保证一个单独的线程。它所保证的是对提交的函数(或lambda 表达式)的异步处理。它提供了一种提供返回值的简单方法(当然,您可以共享一个变量来指示线程之间的状态,但可以自行实现同步)。但是,如果它不在单独的线程上,它怎么能做到这一点呢?
示例时间!
1px;”>…
constexpr自动任务=返回5=2;};
自动复数=std::异步(任务)
康斯特自动重点=重点。获取();
st::cout<<"返回值"<<relt;<std::endl;
...
这有什么用?不多)).需要注意的重要事项是第三行和第四行。所以std::异步(.)仅用一个参数调用,首先。
执行此操作时,实质上为运行时提供选项,以在返回未来对象 上调用get(.)或wait (.)时立即在单独的线程上调用或调用。运行时几乎总是选择后一个选项。
这是否意味着异步是一个谎言?嗯,是的,没有。task (.)中的代码以异步方式执行 , 尽管它在调用get (.)方法时执行,但它确实在另一个线程上执行。因此,它是异步的,但它执行的时间正好。
它还通常在线程池中维护的线程上执行,以提高效率,这是一件好事。这非常适合特定的、划定的任务,如从文件读取或等待网络响应。对于长时间重复执行的东西来说,它不是那么好。
如果您有一个确实需要其自己的线程的任务(如网络轮询),则需要仔细考虑如何实现它。例如,您可以在包含循环的任务中实现轮询,但这将无限期地从 std::async(.) 使用的线程池中删除线程(或直到轮询循环结束)。
还可以通过在主线程中循环并执行任务来执行轮询。但是,这在逻辑上等效于在单个线程上执行任务。任务中的工作将在单独的线程上执行,但通常仅在通过wait(.)或get(.) 引用将来的对象时执行。
如果您正在使用线程的所有资源,则应使用一个资源。第一种情况是从线程池中窃取线程 – 这是您不想做的。以后可能需要这些。第二种情况只是更复杂的同步执行。最好的解决方案?只需创建一个专用线程并使用它。
如果要长时间使用线程,请创建一个线程并使用它。如果只需要在主线程外执行某些内容(如等待网络响应或读取大型文件),请使用任务。