Signed-off-by: Zard-C <patrick.zhang5233@gmail.com>
This commit is contained in:
Zard-C 2024-08-19 14:53:44 +08:00 committed by GitHub
parent 6ddd759973
commit 77c0d58ed3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -57,7 +57,7 @@ auto fut = std::async(doAsyncWork); //线程管理责任交给了标准库的开
有了`std::async`GUI线程中响应变慢仍然是个问题因为调度器并不知道你的哪个线程有高响应要求。这种情况下你会想通过向`std::async`传递`std::launch::async`启动策略来保证想运行函数在不同的线程上执行(见[Item36](../7.TheConcurrencyAPI/item36.md))。
最前沿的线程调度器使用系统级线程池(*thread pool*)来避免资源超额的问题,并且通过工作窃取算法(*work-stealing algorithm*来提升了跨硬件核心的负载均衡。C++标准实际上并不要求使用线程池或者工作窃取实际上C++11并发规范的某些技术层面使得实现这些技术的难度可能比想象中更有挑战。不过库开发者在标准库实现中采用了这些技术也有理由期待这个领域会有更多进展。如果你当前的并发编程采用基于任务的方式在这些技术发展中你会持续获得回报。相反如果你直接使用`std::thread`编程,处理线程耗尽、资源超额、负均衡问题的责任就压在了你身上,更不用说你对这些问题的解决方法与同机器上其他程序采用的解决方案配合得好不好了。
最前沿的线程调度器使用系统级线程池(*thread pool*)来避免资源超额的问题,并且通过工作窃取算法(*work-stealing algorithm*来提升了跨硬件核心的负载均衡。C++标准实际上并不要求使用线程池或者工作窃取实际上C++11并发规范的某些技术层面使得实现这些技术的难度可能比想象中更有挑战。不过库开发者在标准库实现中采用了这些技术也有理由期待这个领域会有更多进展。如果你当前的并发编程采用基于任务的方式在这些技术发展中你会持续获得回报。相反如果你直接使用`std::thread`编程,处理线程耗尽、资源超额、负均衡问题的责任就压在了你身上,更不用说你对这些问题的解决方法与同机器上其他程序采用的解决方案配合得好不好了。
对比基于线程的编程方式,基于任务的设计为开发者避免了手动线程管理的痛苦,并且自然提供了一种获取异步执行程序的结果(即返回值或者异常)的方式。当然,仍然存在一些场景直接使用`std::thread`会更有优势: