C++之线程管控(一)

背景

多线程编程在实际应用中非常常见,它可以帮助我们提高程序性能,实现高效的任务调度。从C++11开始,C++语言已经提供了对多线程编程的原生支持。本文将详细介绍如何使用C++进行线程管控,包括发起线程、等待线程完成、异常处理以及在后台运行线程等内容。

发起线程

C++11提供了一个名为std::thread的类来实现线程创建功能。您需要在std::thread对象的构造函数中提供一个函数指针作为线程的入口点。以下是一个简单的示例,用于创建新线程并运行print_hello函数:

#include <iostream>
#include <thread>

void print_hello() {
  std::cout << "Hello from a new thread!" << std::endl;
}

int main() {
  std::thread t(print_hello);
  t.join();
  return 0;
}

等待线程完成

当发起一个线程并开始执行后,您可能需要等待该线程执行完成。这可以通过调用std::thread::join方法实现。join()方法会阻塞当前线程,直到被调用的线程运行结束。

在上面的示例中,我们已经使用join()方法等待新线程完成:

t.join();

异常处理和线程等待

在多线程环境下,异常处理变得尤为重要。当线程中抛出异常并且未捕获,程序将会异常终止。因此,确保在每个线程中正确处理异常非常关键。下面的示例展示了如何捕获线程中的异常:

#include <iostream>
#include <thread>
#include <stdexcept>

void throw_exception() {
  throw std::runtime_error("An error occurred in the thread!");
}

int main() {
  std::thread t(throw_exception);
  try {
    t.join();
  } catch (const std::runtime_error &e) {
    std::cerr << "Caught exception from thread: " << e.what() << std::endl;
  } catch (...) {
    t.join(); // 确保所有线程都被等待
    throw// 将异常重新抛出
  }
  return 0;
}

在后台运行线程

有时候,您可能不想让主线程坚持等待子线程执行结束。这可以通过std::thread::detach方法实现,该方法允许线程在后台继续运行,不受主线程的影响。在调用detach()方法后,线程对象将 不再保持与线程的连接。

#include <iostream>
#include <thread>
#include <chrono>

void run_in_background() {
  std::this_thread::sleep_for(std::chrono::seconds(2));
  std::cout << "Background thread finished." << std::endl;
}

int main() {
  std::thread t(run_in_background);
  t.detach();
  std::this_thread::sleep_for(std::chrono::seconds(1));
  std::cout << "Main thread finished." << std::endl;
  std::this_thread::sleep_for(std::chrono::seconds(2)); // 确保后台线程有足够时间结束
}

最后

C++11为线程管控提供了简洁而强大的框架。通过这些基础知识,您可以利用多线程构建更复杂的应用程序,同时确保对线程的创建、管理和异常处理能力强大。本文仅为您开始探索C++线程控制奠定基础。在实际项目应用中,还需掌握其他如线程同步、并发容器、线程池等更高级

posted @   冰山奇迹  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示