C++ 多线程的错误和如何避免(12)
std::async 在简单的 IO 上比 std::thread 更有优势
前提:如果我们只需要一些异步执行的代码,这样不会阻塞主线程的执行,最好的办法是使用 std::async 来执行这些代码。这些操作我们也可以使用 std::thread 创建线程并通过函数指针
或者 lambda 参数将可执行代码传递给线程来实现。但是,在后一种情况下,我们要负责管理线程的创建和加入/分离,以及处理线程中可能发生的任何异常。如果使用 std::async,就可以
摆脱这些麻烦,并大大减少陷入死锁的情况。
使用 std::async 的另一个优势是能够通过 std::future 对象将任务结果传回给调用线程。
比如,假设我们有一个返回 int 的函数 ConjureMagic,我们可以创建一个异步任务,然后设置一个 std::future 变量,这样我们就可以在合适的时候在调用的线程中从 std::future 中提取结果。
1 2 3 4 5 6 7 | // spin an async task and get a handle to the future std::future asyncResult2 = std::async(&ConjureMagic); //... do some processing while the future is being set // Get the result from the future int v = asyncResult2.get(); |
相反,使用 std::thread 做这项工作要麻烦得多。这两个选项包括:
- 将对结果变量的引用(使用 std::ref)传递给调用的线程。
- 将结果存储在函数对象的类成员变量中,一旦线程完成执行,就可以检索该变量。
在性能方面,有研究发现创建线程的成本是使用异步的 14 倍。
总而言之,默认使用 std::async,除非能找到直接使用 std::thread 的充分理由(这部分可以参考另一篇文章:std::async 与 std::thread 在什么时候使用比较合适)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
2020-05-28 C#-SendKeys方法的使用