news 2026/5/14 2:29:10

RAII妙用:使用标准库的包装器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RAII妙用:使用标准库的包装器

使用标准库的包装器

#include <iostream> #include <mutex> #include <thread> int x = 0; std::mutex mutex; void fun() { for (int i = 0; i < 100000; i += 1) { std::unique_lock<std::mutex> lock(mutex); // RAII 自动上锁和解锁 x += 1; } } int main() { std::thread th1(fun); std::thread th2(fun); th1.join(); th2.join(); std::cout << x << std::endl; }

文件描述符的管理

文件描述符(File Descriptor)也就是我们常说的fd。在打开并使用后需要将其关闭。

此时有可能出现了我们上面提出的问题,如果出现了异常怎么办?如果编码时遗忘了怎么办?

此时我们就可以使用 RAII 的性质来处理。

借助智能指针的删除器

首先我们完全可以参上前面几个例子来编写一个包装类。

但这里介绍另一个技巧。借助智能指针std::unique_ptr<>指定的删除器来操作。

当我们指定删除器后,在智能指针析构时会调用我们指定的 lambda 表达式,此时就可以保证句柄的 close 操作。

#include <fcntl.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <memory> int main(int argc, char **argv) { int fd = open("out.txt", O_WRONLY | O_CREAT, 0666); if (fd == -1) { perror("open fail\n"); return -1; } // 将删除器指定为一个lambda表达式 std::unique_ptr<int, void (*)(int *)> smartFD(&fd, [](int *p) { close(*p); }); for (int i = 0; i < argc; i += 1) { int len = write(fd, argv[i], strlen(argv[i])); if (len < 0) { perror("write fail\n"); return -1; } } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/14 2:26:17

EDA/IP行业动态:从SPICE模型到硅光子平台的技术演进与工程实践

1. 行业动态综述&#xff1a;2013年3月EDA/IP领域的关键脉动作为一名在半导体设计与EDA工具领域摸爬滚打了十多年的工程师&#xff0c;我养成了一个习惯&#xff0c;就是定期梳理行业新闻。这不仅仅是了解市场动向&#xff0c;更是为了从工具厂商、IP供应商和代工厂的最新动作中…

作者头像 李华
网站建设 2026/5/14 2:26:15

HyperLynx DRC:高速PCB设计的电气规则检查技术解析

1. HyperLynx DRC&#xff1a;高速PCB设计的电气规则守护者 在当今GHz级时钟速率和纳秒级边沿时间的PCB设计领域&#xff0c;传统"设计-原型-测试-返工"的迭代模式已变得成本高昂且效率低下。我曾参与过一个25Gbps背板设计项目&#xff0c;在首次投板后才发现由于参考…

作者头像 李华
网站建设 2026/5/14 2:22:52

低频段频谱:移动网络广覆盖与物联网连接的核心基石

1. 移动网络的“隐形脊梁”&#xff1a;为什么低频段频谱不可或缺在谈论5G、6G这些前沿技术时&#xff0c;我们总被那些惊人的峰值速率和毫米波&#xff08;mmWave&#xff09;的炫酷应用所吸引。然而&#xff0c;作为一名在射频&#xff08;RF&#xff09;与微波领域摸爬滚打多…

作者头像 李华
网站建设 2026/5/14 2:22:05

别再手动导数据了!PostgreSQL COPY命令的5个高效场景与避坑指南

别再手动导数据了&#xff01;PostgreSQL COPY命令的5个高效场景与避坑指南 每天手动导入导出数据&#xff0c;不仅效率低下&#xff0c;还容易出错。PostgreSQL的COPY命令正是解决这一痛点的利器&#xff0c;它能以惊人的速度完成大批量数据迁移&#xff0c;同时保持数据一致性…

作者头像 李华
网站建设 2026/5/14 2:17:06

Jenkins CI/CD 自动化部署流水线

一、项目概述 本项目将在已经部署好的高可用 Web 集群 ELK 日志系统基础上&#xff0c;搭建一套完整的 Jenkins 持续集成 / 持续部署流水线&#xff0c;实现代码从 Git 提交到自动部署到生产环境的全流程自动化。 这是运维工程师求职的核心加分项&#xff0c;几乎所有互联网…

作者头像 李华