当前位置: 首页 > news >正文

线程的等待,分离,与异步获取执行结果

在C++中,可以通过不同的方式来处理线程的等待、分离,以及异步获取执行结果。以下分别讲解这些概念,并提供相应的代码示例。

1. 线程的等待(Join

std::thread::join() 是使主线程等待其他线程结束的方法。调用这个方法将阻塞调用线程,直到目标线程执行完毕。

示例代码:线程的等待

#include <iostream>
#include <thread>void thread_function() {std::cout << "Thread is running..." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟工作std::cout << "Thread has finished." << std::endl;
}int main() {std::thread t(thread_function);std::cout << "Main thread is waiting for the worker thread to finish." << std::endl;t.join(); // 等待子线程完成std::cout << "Worker thread has completed." << std::endl;return 0;
}

2. 线程的分离(Detach

std::thread::detach() 使线程与主线程分离,成为一个独立运行的线程。分离的线程完成后,自身资源会被自动释放。注意:主线程结束后,分离的线程仍在运行可能导致资源访问问题。

示例代码:线程的分离

#include <iostream>
#include <thread>void thread_function() {std::cout << "Detached thread is running..." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟工作std::cout << "Detached thread has finished." << std::endl;
}int main() {std::thread t(thread_function);t.detach(); // 分离线程std::cout << "Main thread continues running without waiting for the detached thread." << std::endl;// 等待一段时间以确保分离线程有机会完成std::this_thread::sleep_for(std::chrono::seconds(3));std::cout << "Main thread has finished." << std::endl;return 0;
}

3. 使用 std::async  std::future 异步获取执行结果

std::async 可以启动一个异步任务,并返回一个 std::future 对象来获取执行结果。这样可以方便地在主线程中等待任务完成并获取结果。

示例代码:异步获取执行结果

#include <iostream>
#include <future>
#include <thread>int compute_square(int value) {std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟长时间计算return value * value;
}int main() {std::future<int> result = std::async(std::launch::async, compute_square, 5);std::cout << "Computing square of 5 asynchronously..." << std::endl;// 可以进行其他操作std::cout << "Main thread is free to do other work." << std::endl;// 等待结果并获取返回值int square = result.get(); // 阻塞直到结果可用std::cout << "Square of 5 is: " << square << std::endl;return 0;
}

总结

以上示例展示了如何在C++中使用线程的不同机制:

  • 等待(Join):使用 join() 等待线程完成。
  • 分离(Detach):使用 detach() 使线程独立运行。
  • 异步获取执行结果:使用 std::async 和 std::future 来启动任务并获取结果。
  • 通过这些机制,开发者可以有效地管理多线程程序的行为和资源使用。

http://www.mrgr.cn/news/64360.html

相关文章:

  • node.js学习Day2
  • 机房布局.
  • springboot3配置日志logback
  • TOEIC 词汇专题:旅游计划篇
  • php反序列化靶场随笔分析
  • Linux:线程安全的单例模式
  • 线程的joinable属性,以及主线程出现异常时,对其等待应该进行的处理
  • MybatisPlus - 扩展功能
  • 文献阅读记录6-Toward computer-made artificial antibiotics
  • 初始JavaEE篇——多线程(8):JUC的组件
  • EDM平台升级 送达率与效果并进
  • tftp协议笔记
  • 【C++刷题】力扣-#643-子数组最大平均数I
  • 堆的实现--数据结构
  • 重装linux系统
  • 网页自动化测试和爬虫:Selenium库入门与进阶
  • C语言中的希尔排序
  • 大厂面试真题-如果使用guava limiter实现实例级别的缓存
  • JSP ft06 问题几个求解思路整理
  • 我国在AI领域的发展趋势
  • 【springcloud】服务之间调用失败的重试机制
  • 微服务架构面试内容整理-微服务架构的定义及优势
  • C++ --- 多线程的使用
  • 《程序内存需求估算:职场中的“暗礁”与“灯塔”》
  • 网络通信与并发编程(九)asyncio
  • 【ReactPress】一款基于React的开源博客CMS内容管理平台—ReactPress