
c++ 高并发模板类std::async()
默认策略: 资源管理:确保在 阻塞与非阻塞:使用
发布日期:2021-05-14 06:38:05
浏览次数:17
分类:精选文章
本文共 1191 字,大约阅读时间需要 3 分钟。
C++11 异步编程入门
在 C++11 中,std::async
函数成为异步编程的重要工具。它允许我们在后台线程执行任务,同时返回一个 std::future
对象,这样就能在适当的时候获取执行结果。
异步执行的基础
std::async
函数的默认行为是使用 std::launch::deferred
策略。这意味着新启动的线程会立即执行任务,但当前线程不会等待结果。这样可以避免阻塞主线程,适用于需要长时间执行的任务。
示例代码
#include#include #include using namespace std;void task() { for (int i = 0; i < 10; i++) { cout << "k" << endl; }}int main() { // 使用默认策略(deferred),执行任务并阻塞获取结果 auto ret = async(task); for (int i = 0; i < 10; i++) { cout << "M"; } ret.get(); // 阻塞直到任务完成 cout << "probe flag 1" << endl; sleep(10);}
通过策略控制线程行为
std::launch
枚举类型提供了多种策略来控制线程的执行方式:
std::launch::async
:直接启动一个新的线程执行任务,当前线程会等待任务完成。std::launch::deferred
:让当前执行完当前线程的任务后,启动新的线程执行剩余部分。默认策略。
通过不同的策略,可以灵活控制线程的创建和执行顺序:
示例代码
{ // 异步执行,启动新的线程并等待结果 auto ret = async(std::launch::async, task);}
{ // 延迟执行,任务不会阻塞当前线程 auto ret = async(std::launch::deferred, task); // ret.get() 会等待任务完成}
注意事项
std::async
的默认策略是 std::launch::deferred
,不要以为它不会执行任务。future.get()
括号作用域内清理资源,否则可能导致内存泄漏。std::launch::async
会阻塞当前线程,使用 std::launch::deferred
则不会。通过合理选择 std::launch
策略,我们可以在不同的场景下充分利用异步编程的优势。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月22日 06时13分11秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
API_Net官方代码之训练网络
2021-05-14
Python机器学习(五十二)SciPy 基础功能
2021-05-14
Python机器学习(六十五)Matplotlib 入门
2021-05-14
关于WebView当前地址问题的疑惑
2021-05-14
Python机器学习(九十二)Pandas 统计
2021-05-14
项目实战从0到1之hive(24)企业级数据仓库构建(六):数仓理论及数仓搭建
2021-05-14
SecSolar:为代码“捉虫”,让你能更专心写代码
2021-05-14
iOS UIPickerView和UIDatePicker控件
2021-05-14
1965 - 2019 年最流行的编程语言变化
2021-05-14
链上钱包的博彩雷区
2021-05-14
GRUB2
2021-05-14
微信JS-SDK DEMO页面和示例代码
2021-05-14
XYNUOJ
2021-05-14
Chrome查找发请求的js之黑箱调试
2021-05-14
CMCC登录参数分析
2021-05-14
win7一激活就蓝屏
2021-05-14
GridView的另外一种分页方式,可提高加载速度
2021-05-14
委托-利用GetInvocationList处理链式委托
2021-05-14