C++ 多线程编程教程:使用 std::thread 和 std::future 进行并发任务管理 ,处理线程超时

C++ 多线程编程教程:使用 std::thread 和 std::future 进行并发任务管理

引言

多线程编程是一种强大的工具,可以加速计算密集型任务的执行,提高应用程序的性能。C++提供了多种多线程编程工具,包括std::threadstd::future,用于管理并发任务。在本教程中,我们将详细介绍如何使用这两个工具来启动和管理多个线程,以执行并发任务。我们还将讨论如何处理线程超时和异常情况。

使用 std::thread 启动和管理线程

步骤1:包含必要的头文件

在开始之前,首先需要包含必要的头文件。

#include <iostream>
#include <vector>
#include <thread>

步骤2:创建线程容器

首先,我们创建一个用于存储线程的容器,通常使用std::vector<std::thread>

std::vector<std::thread> threads;

步骤3:启动线程执行函数

接下来,我们通过循环遍历一个数据集,为每个数据元素创建一个线程,并将它们添加到线程容器中。在本例中,我们假设数据集是d.vurlData,线程执行的函数是test(data)

for (auto& data : d.vurlData) {
    threads.emplace_back(std::thread{ [this,&data] { test(data); } });
}

步骤4:等待所有线程完成

最后,我们使用循环遍历线程容器,并检查每个线程是否可加入(joinable)。如果线程可加入,我们调用join()函数等待线程执行完成。

for (auto& thread : threads) {
    if (thread.joinable())
        thread.join();
}

这样,所有线程将在任务完成后安全退出。

使用 std::future 进行线程管理和超时处理

步骤1:包含必要的头文件

同样,在开始之前,需要包含必要的头文件。

#include <iostream>
#include <vector>
#include <thread>
#include <future>
#include <chrono>

步骤2:创建线程容器和期望值容器

与之前一样,我们创建一个线程容器std::vector<std::thread>和一个用于存储std::future的容器std::vector<std::future<void>> futures

std::vector<std::thread> threads;
std::vector<std::future<void>> futures;

步骤3:创建线程和期望值

不同于之前,我们使用std::packaged_task来封装线程执行函数,然后将其与std::future关联起来。这样可以获得对线程的更多控制,并能够处理超时情况。

for (auto& data : Data) {
    std::packaged_task<void()> task([this, &data] { test(data); });
    futures.push_back(task.get_future());
    threads.emplace_back(std::move(task));
}

步骤4:检查线程执行状态和处理超时

在循环中,我们使用std::future::wait_for函数检查每个线程的执行状态,如果线程在指定的时间内没有完成(这里设置为1秒),我们可以选择将其分离(detach),表示不再等待线程完成,或者调用join()等待线程完成。

for (size_t i = 0; i < threads.size(); ++i) {
    std::future_status status = futures[i].wait_for(std::chrono::seconds(1));
    if (status == std::future_status::timeout) {
        threads[i].detach(); // 超时情况下分离线程
    } else {
        threads[i].join(); // 正常情况下等待线程完成
    }
}

这样,我们可以在超时情况下停止线程的执行,以确保程序不会因为某个线程长时间阻塞而失去响应。

总结

本教程介绍了如何使用C++中的std::threadstd::future来启动和管理多个线程,以执行并发任务。我们学习了如何等待线程完成,以及如何处理线程超时情况。多线程编程可以帮助您充分利用现代多核处理器,提高应用程序性能,但同时也需要小心处理线程之间的同步和异常情况,以确保程序的稳定性和可维护性。希望这个教程对您有所帮助,能够让您更好地理解和使用C++中的多线程编程工具。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磊磊cpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值