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

C++ 多线程

线程基本概念

线程(Thread)是操作系统能够进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。

在多线程OS中,线程不是一个可执行的实体。线程的生命周期分为了5个阶段,创建—>就绪—>运行—>死亡,运行的中途可能会有阻塞。

一般情况下,父线程与子线程相互不影响,即子线程结束,父线程不一定结束;父线程结束,子线程不一定结束;父线程异常,子线程不一定异常;子线程异常,父线程不一定异常。但当设置守护线程等特殊操作时,父线程与子线程会发生相互影响。

多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。在一个程序中,这些独立运行的程序片段叫作“线程”,利用它编程的概念就叫作“多线程处理”。

C++中的线程

C++11引入了thread库,允许开发者使用C++标准库来创建和管理线程。thread库提供了一种简单、高效、跨平台的方式来创建和管理多线程程序。

以下是C++ thread库的一些主要功能:

  1. 创建线程:使用std::thread类,可以创建一个新的线程。可以通过传递一个可调用对象(如函数、Lambda表达式等)作为线程的入口点。
std::thread t1(function1);
std::thread t2(function2);
  1. 等待线程:可以使用std::thread类的join()方法等待一个线程完成。join()方法会阻塞当前线程,直到调用join()的线程结束为止。
t1.join();
t2.join();
  1. 分离线程:可以使用std::thread类的detach()方法将线程分离。分离后的线程在执行完毕后会自动释放资源,不会阻塞主线程。
t1.detach();
t2.detach();
  1. 获取线程ID:可以使用std::thread类的get_id()方法获取线程的唯一ID。
std::thread::id id1 = t1.get_id();
std::thread::id id2 = t2.get_id();
  1. 比较线程:可以使用std::thread类的operator==()和operator!=()方法比较两个线程是否相等。
bool is_equal = (t1 == t2);
bool is_not_equal = (t1 != t2);
  1. 设置线程属性:可以使用std::thread类的native_handle()方法获取线程的底层操作系统句柄,然后使用pthread_setschedparam()等函数设置线程的调度属性。
pthread_t handle = t1.native_handle();
pthread_setschedparam(handle, SCHED_RR, 10);

一个小Demo

#include <iostream>
#include <thread>

void print_Thread_Hello()
{
    std::cout << "Thead ID:" << std::this_thread::get_id() << '\t' << "Hello!" << std::endl;
}

void test()
{
    print_Thread_Hello();
}

int main()
{
    std::thread work(test);
    work.join();    // 等待线程work
    print_Thread_Hello();
    return 0;
}

C++的thread库为多线程编程提供了简单、高效、跨平台的支持,使得在C++程序中创建和管理线程变得更加方便。

相关文章:

  • 2024双十一有什么值得买的好物?力荐五款好用不踩雷的好物推荐!
  • Python 3 和 MySQL(PyMySQL) 的集成使用
  • 脉冲神经网络(SNN)论文阅读(六)-----ECCV-2024 脉冲驱动的SNN目标检测框架:SpikeYOLO
  • 【大数据】Flink CDC 实时同步mysql数据
  • Vim基本用法
  • Flet介绍:平替PyQt的好用跨平台Python UI框架
  • Python小示例——质地不均匀的硬币概率统计
  • Python+ffmpeg实现字幕视频合并
  • 【Android 14源码分析】Activity启动流程-3
  • 智能工厂的软件设计 【三ji】公共逻辑语言映射到祖传代码( 元级)中为“Program”规划了三层置标架构,即“Program”的标准通用置标语言
  • 【前沿 热点 顶会】NIPS 2024中目标检测有关的论文
  • XHTML 简介
  • 【Mac】和【安卓手机】 通过有线方式实现投屏
  • 数据结构之串
  • 王者农药更新版
  • [C#]使用纯opencvsharp部署yolov11-onnx图像分类模型
  • 基于深度学习的乳腺癌分类识别与诊断系统
  • macos 中使用macport安装,配置,切换多版本php,使用port 安装php扩展方法总结
  • cherry-markdown开源markdown组件详细使用教程
  • 一、Python(介绍、环境搭建)
  • 朝着解决问题的正确方向迈进——中美经贸高层会谈牵动世界目光
  • 扶桑谈|从石破茂“越菲行”看日本周边外交布局战略新动向
  • 外交部:中方期待印巴巩固和延续停火势头,避免冲突再起
  • 百利天恒董事长向复旦捐赠三千万元,用于支持创新药物靶点发现等师资建设需要
  • 人民日报刊文:守护“技术进步须服务于人性温暖”的文明底线
  • AI药企英矽智能第三次递表港交所:去年亏损超1700万美元,收入多数来自对外授权