C++线程的移动语义

在C++标准库中,std::thread 和 std::ifstream 都设计为不可复制的(non-copyable),但可移动的(movable)。这样做的原因和它们的实现方式以及移动操作的优点和使用场合如下:

原因

  1. 不可复制的理由:
    • std::thread:一个线程对象表示一个实际的操作系统线程,复制一个线程对象意味着复制一个正在运行的线程,这在逻辑上是不可行的,因为一个线程不能同时在两个地方运行。
    • std::ifstream:一个文件流对象通常与一个特定的文件描述符相关联,复制文件流对象会导致多个对象共享同一个文件描述符,这会导致不一致的文件状态和未定义的行为。
  2. 可移动的理由:
    • 允许资源的转移:通过移动操作,可以将线程或文件流对象所控制的资源从一个对象转移到另一个对象,而不会出现共享资源的情况。这保证了资源的唯一性和一致性。

实现

std::thread 和 std::ifstream 的不可复制和可移动特性是通过以下方式实现的:

不可复制:

通过将复制构造函数和复制赋值操作符声明为 delete 或 private,防止对象的复制。

class thread {
public:thread(const thread&) = delete;thread& operator=(const thread&) = delete;
};

可移动:

通过定义移动构造函数和移动赋值操作符,允许对象的资源在对象之间转移。

class thread {
public:thread(thread&& other) noexcept {// 转移资源}thread& operator=(thread&& other) noexcept {if (this != &other) {// 释放当前资源,转移其他对象的资源}return *this;}
};

优点和使用场合

  1. 线程资源的唯一性:
    • 通过移动操作,可以确保线程资源在任何时刻只被一个对象控制,避免了资源共享带来的潜在问题。
    • 示例:在一个函数内部创建一个线程,并将其移动到函数外部的一个对象中:
      std::thread create_thread() {std::thread t([]() {// 线程函数});return t; // 移动构造函数被调用
      }std::thread outer_thread = create_thread(); // 移动赋值操作符被调用

  2. 灵活性和性能:
    • 移动操作允许对象在函数调用、返回值等场景中更灵活地传递,而不需要进行资源复制,这在性能敏感的场景中尤为重要。
    • 示例:在多线程编程中,传递线程对象时不需要复制线程的内部状态,减少了开销。
  3. 处理所有权转移:
    • 在某些设计模式中,移动操作可以用于明确地转移资源的所有权,确保资源的完整性。
    • 示例:在工厂模式中,生成的线程对象可以通过移动操作转移给其他组件进行管理。

总结

std::thread 和 std::ifstream 支持移动而不支持复制的理由是为了保证资源的唯一性和减少潜在的资源共享问题。通过移动构造函数和移动赋值操作符,这些对象可以在不复制底层资源的情况下进行转移,这提高了系统的灵活性、性能和安全性。在多线程编程和文件处理等场景中,这种设计模式尤为重要,确保了资源的安全管理和高效使用。

线程移动后,原线程所拥有的资源也一并转移了,原线程“只剩空壳”,析构了

当你移动一个 std::thread 对象时,它的底层线程资源会被转移给新的对象,而原来的 std::thread 对象将不再拥有任何资源,变成一个“空壳”。在C++中,这种情况下原线程对象的析构是安全的,不会导致任何问题。

线程移动的实现细节

1. 移动构造函数

class thread {
public:thread(thread&& other) noexcept {// 转移资源native_handle_ = other.native_handle_;other.native_handle_ = nullptr; // 原对象的资源指针置空}// 其他成员函数和数据成员private:std::thread::native_handle_type native_handle_;
};

在这个例子中,native_handle_ 是一个表示底层线程资源的指针。通过移动构造函数,原线程对象的 native_handle_ 被赋值给新对象,而原对象的 native_handle_ 被置为 nullptr,表示它不再控制任何线程资源。

2. 移动赋值操作符

thread& operator=(thread&& other) noexcept {if (this != &other) {// 释放当前资源if (joinable()) {join(); // 或者 detach(),取决于设计}// 转移其他对象的资源native_handle_ = other.native_handle_;other.native_handle_ = nullptr;}return *this;
}

在移动赋值操作符中,首先确保当前对象不是自身,然后释放当前对象可能持有的资源(如果已经有一个线程在运行),最后将原对象的资源指针转移给当前对象,并将原对象的资源指针赋空。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/463794.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pycharm jupyter】启动报错

报错信息 upyter server process exited with code 1 ServerApp] A _jupyter_server_extension_points function was not found in jupyter_lsp. Instead, a _jupyter_server_extension_paths function was found and will be used for now. This function name will be depre…

精密机械代加工服务,为你的企业加速发展!

在当今竞争激烈的工业领域,精密机械代加工服务正成为众多企业实现快速发展的关键助力。这种专业服务凭借其独特的优势,为企业解决了诸多生产难题,推动企业在市场中大步向前。 先进的技术与设备 精密机械代加工服务提供商通常配备了先进的加工…

Data+AI━━揭秘千亿参数背后的技术较量:全球巨头的大模型布局!

DataAI━━揭秘千亿参数背后的技术较量:全球巨头的大模型布局! 前言大语言模型:AI技术创新的新高地智能技术创新的"深水区"智能革命的下一站 前言 站在2024年科技创新的潮头,一场由大语言模型引发的技术革命正在上演。从ChatGPT引爆…

jmeter压测工具环境搭建(Linux、Mac)

目录 java环境安装 1、anaconda安装java环境(推荐) 2、直接在本地环境安装java环境 yum方式安装jdk 二进制方式安装jdk jmeter环境安装 1、jmeter单机安装 启动jmeter 配置环境变量 jmeter配置中文 2、jmeter集群搭建 多台机器部署jmeter集群…

草料二维码:低成本高效率的访客管理解决方案

在当前的商业和政治环境中,企业和政府机构越来越重视安全保密措施,尤其是对外来人员的行踪记录和管理。访客管理已成为企业运营中不可或缺的一环,它不仅提升了安全性,还增强了效率和便捷性。然而,许多机构仍在使用传统…

AOSP刷机

手机电脑都换了 从新复习一下吧 刷机分为几类 线刷 介质:通过USB数据线连接手机与电脑。 方法:通常使用专门的刷机工具(如ADB、Fastboot、Odin等)将ROM文件直接刷入设备。 优点:一般可以进行更全面的刷机操作&#x…

unocss 添加支持使用本地 svg 预设图标,并支持更改大小

安装 pnpm install iconify/utils 在配置文件 unocss.config.ts: presets > presetIcons 选项中 通过 FileSystemIconLoader 加载本地图标,并指定目录。 import presetWeapp from unocss-preset-weapp import { extractorAttributify, transformer…

一篇文章理解CSS垂直布局方法

方法1&#xff1a;align-content: center 在 2024 年的 CSS 原生属性中允许使用 1 个 CSS 属性 align-content: center进行垂直居中。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewpo…

基于STM32+华为云IOT设计的大棚育苗管理系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 模块的技术详情介绍【1】NBIOT-BC26模块【2】MQ135传感器【4】SHT30传感器【5】B1750传感器 二…

小家电常用防水触摸IC

小家电常用防水触摸IC 挑战100个ICMAN“芯”实验-小家电常用防水触摸IC 电容式触摸芯片通常用于实现触摸控制&#xff0c;可轻松解决家用电器常见的触摸感应不灵敏和有水误触发的问题&#xff0c;优化了用户的交互使用体验&#xff0c;从而有效实现控制面板触摸按键的触摸感应和…

C++和OpenGL实现3D游戏编程【连载17】——着色器进阶

欢迎来到zhooyu的专栏。 主页网址&#xff1a;【zhooyu】 专栏网址&#xff1a;【C和OpenGL实现3D游戏编程】 &#x1f31f;&#x1f31f;&#x1f31f;这里将通过一个OpenGL实现3D游戏编程实例教程&#xff0c;带大家深入学习OpenGL知识。知识无穷而人力有穷&#xff0c;希望…

2342423

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

《Python游戏编程入门》注-第4章8

2.2 “黄色炸弹”的实现 “黄色炸弹”实际上是不断重复地从屏幕顶端落下的黄色圆圈。 2.2.1 设置炸弹位置及下落速度 从图1中可以看出,“黄色炸弹”落下的位置(水平方向)是随机的,图8所示代码用来设置炸弹位置及下落速度。 图8 设置炸弹位置及下落速度的代码 其中,bom…

如何打开/关闭 GitLab 的版本检查功能?

本文分享如何打开/关闭 GitLab 的版本检查功能。 极狐GitLab 是 GitLab 的中国发行版【https://dl.gitlab.cn/ncecn6kb】&#xff0c;中文版本对中国用户更友好&#xff0c;文章以私有化部署的极狐GitLab 实例来演示版本检查功能的开启和关闭。强烈不建议关闭该功能&#xff0…

Linux——Ubuntu环境C编程

配置vim编辑器 设置一个tab键为4个空格 打开/etc/vim/vimrc文件&#xff0c;此文件为只读&#xff0c;所以要用sudo访问boot权限&#xff1a; set ts4&#xff08;设置一个tab键为4空格&#xff09; set nu&#xff08;vim编辑器下显示行号&#xff09; gcc编译器 gcc命令…

java访问华为网管软件iMaster NCE的北向接口

最近做的一个项目&#xff0c;需要读取华为一个叫iMaster NCE的网管软件的北向接口。这个iMaster NCE&#xff08;以下简称NCE&#xff09;用于管理项目的整个网络&#xff0c;尤其是光网络。业主要求我们访问该软件提供的对外接口&#xff0c;读取一些网络信息&#xff0c;比如…

ABeam 德硕 | 共探AI时代人才新生态,ABeam旗下德硕管理咨询(上海)有限公司荣膺2024杰出雇主!

ABeam News 近日&#xff0c;由HRoot主办的“2024中国人力资本发展大会”在上海市徐汇西岸艺术中心A馆盛大开幕并成功举办。大会以“智能协同 人才与AI的共生”为主题&#xff0c;作为咨询公司的ABeam中国&#xff0c;以优秀的人才管理理念及成果&#xff0c;受邀参会并荣获20…

App Store 截图生成器:轻松制作专业级应用营销图片

在线使用 &#x1f449; 立即使用截图生成器 简介 App Store 截图生成器是一个专门为 iOS 开发者和营销人员设计的在线工具&#xff0c;可以快速生成符合 App Store 规范的应用预览图片。无论是 iPhone 还是 iPad 应用&#xff0c;都能轻松创建出精美的营销截图。 主要特点…

数据结构之顺序表(C语言)

1 线性表 线性表是n个具有相同特性的数据元素的有限序列&#xff0c;是一种在实际中广泛应用的数据结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列、字符串等。 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是在物理结构上并不一定是…

#【YashanDB认证】#YCA的学习过程总结-之崖山数据库初体验

概述 前段时间崖山数据库做推广活动&#xff0c;参加了yca的考试&#xff0c;为啥参加这个数据库厂商的学习呢&#xff0c;因为目前这个数据库最像Oracle&#xff0c;又听公司的前辈说呢&#xff0c;这个公司的前身是华为人出来做的数据库&#xff0c;华为人的精神呢&#xff0…