首页 > 编程语言 >C++之线程管控(一)

C++之线程管控(一)

时间:2023-07-08 11:22:16浏览次数:45  
标签:std join 管控 thread C++ 线程 include

背景

多线程编程在实际应用中非常常见,它可以帮助我们提高程序性能,实现高效的任务调度。从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++线程控制奠定基础。在实际项目应用中,还需掌握其他如线程同步、并发容器、线程池等更高级

标签:std,join,管控,thread,C++,线程,include
From: https://www.cnblogs.com/blizzard8204/p/17536952.html

相关文章

  • C++之线程管控(二)
    背景随着多核处理器的普及,多线程编程已经成为软件开发中不可或缺的一部分。C++11标准为我们带来了线程库,让我们能够更方便地在C++中实现多线程编程。在这篇博客中,我们将介绍C++线程管控的基本概念和方法,包括向线程函数传递参数,移交线程归属权,运行时选择线程数量和识别线程。向线......
  • Java和线程的一些讨论
    Java语言及Java的多线程机制,其中:第一部分是对Java简介,包括Java产生的背景和经过、Java的特点和应用方向、Java发展趋势.第二部分介绍面向对象的Java编程方法、及与C++语言作了一些比较.包括如何编写JavaApolet、在Applet中如何实现各种常用对象、以及使用Java实现高级编程(......
  • C++ Primer 学习笔记——第七章
    第七章类前言基本数据类型有时候并不能解决某些特定问题,而通过自定义的类就可以通过理解问题概念,使得程序更加容易编写、调试和修改。类的基本思想是数据抽象(dataabstraction)和封装(encapsulation)。数据抽象是一种依赖于接口(interface)和实现(implementation)分离的编程(以及设......
  • c++ 科幻版 沙漠神殿2
    #include<iostream>#include"minecraft.h"#include<string>usingnamespacestd;TxMinecraftmc;intx,y,z;boolcon;boollianjie(){ returncon=mc.ConnectMinecraft("mc.makeblock.net.cn","a9d44e758f6e4cf8b2da26241......
  • 请使用C++计算出2^2023与3^2023的和
    易知,这个和的数字是非常大的,大到longlong都装不下,这个时候如果使用longlong是无法进行运算的。欸!这会高精度算法(即大数运算)就开始发光发热了。以下是我看资料总结的一些歪瓜裂枣。对于一位高精度数字,用整数数组存储,数组每一个元素对应一位十进制数,由其下标顺序指明位序号......
  • 2023年7月7日,线程池的调用原理,线程池底层,任务队列
    线程池的调用原理线程池的七大参数:核心线程数、最大线程数、任务队列、拒绝策略、闲置时间、时间单位、线程工厂任务进入线程池后线程池的执行顺序:核心线程(用完)---处理完一个任务后会取出任务队列中的第一个任务来执行任务队列(装满)普通线程(用完)拒绝策略深入线程池ExecutorServicep......
  • 进程与线程的一个简单解释
    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。1.计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。2.假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一......
  • 进程池和线程池
    一、进程池1、进程池 ProcessPoolExecutor优点:减少进程创建和销毁的开销:创建和销毁进程是一个相对耗时的操作,涉及到操作系统的系统调用和资源分配。使用进程池,可以预先创建一组进程,并在需要时重用这些进程,避免了频繁的进程创建和销毁开销,提高了程序的性能和效率。控制并......
  • 进程与线程的一个简单解释
    进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。1. 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。2. 假定工厂的电力有限,一次只能供给一个车间......
  • c++沙漠神殿
    #include<iostream>#include"minecraft.h"#include<string>usingnamespacestd;TxMinecraftmc;intx=0,y=0,z=0;intmain(intargc,char**argv){boolcon=mc.ConnectMinecraft("zk.makeblock.net.cn","a9d44e758f6e4cf8b......