0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++可移植性及多线程

C语言与CPP编程 来源:C语言与CPP编程 作者:C语言与CPP编程 2022-10-10 10:26 次阅读

本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第五篇。

C++最佳实践:

1. 工具

2. 代码风格

3.安全性

4.可维护性

5.可移植性及多线程(本文)

6.性能

7.正确性和脚本

可移植性

明确使用的类型

大多数产生告警的可移植性问题都是因为我们没有注意类型。标准库和数组使用size_t作为索引,标准容器的大小使用size_t类型。如果对size_t的处理不正确,可能会潜伏有微妙的64位问题,这种问题只有在开始32位整型索引溢出之后才会出现。另一种类似问题是char类型和unsigned char类型的使用。

使用标准库

std::filesystem

C++17新增了新的filesystem库,在所有支持的编译器上提供了可移植的文件系统访问能力。

std::thread

C++11的线程功能能够基于pthread或WinThreads使用。

其他

本系列中的其他大多数问题最终都可以归结到可移植性上,尤其要注意避免静态(static)类型(参考下文多线程部分)。

多线程

避免全局数据

全局数据会导致函数之间意想不到的副作用,并可能使代码难以甚至无法并行化。即使现在的代码不是为了并行化而写,也没有理由在将来永远不做并行化。

静态(static)数据

除了作为全局数据之外,静态数据并不总是像期望的那样被构造和析构,在跨平台环境中尤其如此。例如,有个g++的bug[2]就是关于从动态模块加载的共享静态数据的销毁顺序的。

共享指针

std::shared_ptr和全局变量一样(http://stackoverflow.com/a/18803611/29975),允许多段代码与相同的数据交互。

单例(Singleton)

单例通常使用静态和/或shared_ptr实现。

避免堆操作

堆操作在多线程环境中要慢得多,在许多甚至大多数情况下,复制数据会更快,更别提还有move操作这之类的东西。

互斥对象(mutex)和可变对象(mutable)一起使用(M&M规则,C++11)

对于成员变量,最好同时使用互斥锁和可变变量,这在两方面都适用:

可变成员变量被假定为共享变量,因此应该与互斥锁同步(或原子化)。

如果一个成员变量本身是互斥的,那么应该是可变的,这是在const成员函数中使用它所必需的。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    21

    文章

    2065

    浏览量

    72874
  • 代码
    +关注

    关注

    30

    文章

    4552

    浏览量

    66628
  • 可移植性
    +关注

    关注

    0

    文章

    5

    浏览量

    7569

原文标题:C++最佳实践 | 5. 可移植性及多线程

文章出处:【微信号:C语言与CPP编程,微信公众号:C语言与CPP编程】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    现代C++项目的最佳实践

    本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是
    发表于 09-29 11:32 832次阅读

    Java多线程的用法

    本文将介绍一下Java多线程的用法。 基础介绍 什么是多线程 指的是在一个进程中同时运行多个线程,每个线程都可以独立执行不同的任务或操作。 与单线程
    的头像 发表于 09-30 17:07 599次阅读

    [原创]嵌入式操作系统的可移植性

      嵌入式操作系统的可移植性创易电子整理出品,创易更懂电子, http://52edk.taobao.com/ 全系列阻容感一本全掌控。许多操作系统夸耀自己的可移植性时,爱这样说
    发表于 03-16 22:11

    51单片机多线程实现

    51单片机多线程实现,给STC89C52RC单片机移植RTX-Tiny操作系统,简单到爆,B格拉满了,好吧?
    发表于 07-14 06:43

    Multi-Threaded多线程编程

    C++ 多线程(一)Multi-Threaded多线程编程术语线程更确切地说,是执行线程,它是最小的处理单元。由操作系统调度。通常它包含在进
    发表于 08-24 08:31

    一文搞懂C++多线程rknn_ssd例程

    1、C++多线程rknn_ssd例程简析本例程修改自rk官方提供的rknn_sdd.cpp,处理的数据流来自usb-camera,帧率在25fps添加本地视频读取功能,640x480的视频流,帧率可达50fps支持线程绑定CPU
    发表于 08-01 17:53

    如何使用std::future/std::promise 和 std::packaged_task来促进esp32上的多线程

    信不适用于 std::thread。您如何建议我执行与所需功能兼容的多任务处理?我应该使用附加组件从 pthread 层开始,还是可以使用 std::thread 实现完全可移植性
    发表于 03-02 08:44

    C++ 面向对象多线程编程下载

    C++ 面向对象多线程编程下载
    发表于 04-08 02:14 70次下载

    C++面向对象多线程编程 (pdf电子版)

    C++面向对象多线程编程共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了
    发表于 09-25 09:39 0次下载

    多线程好还是单线程好?单线程多线程的区别 优缺点分析

    摘要:如今单线程多线程已经得到普遍运用,那么到底多线程好还是单线程好呢?单线程多线程的区别又
    发表于 12-08 09:33 8w次阅读

    什么是多线程编程?多线程编程基础知识

    摘要:多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程以及多线程编程相关知识而做出的一些结论。
    发表于 12-08 16:30 1.2w次阅读

    一文解读32位单片机的应用可移植性

    本文主要介绍了32位单片机的应用可移植性.
    发表于 06-28 03:25 0次下载
    一文解读32位单片机的应用<b class='flag-5'>可移植性</b>

    C++项目常见的命名规范

    本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是
    的头像 发表于 09-27 09:12 1796次阅读

    如何用C++实现一个线程池呢?

    C++线程池是一种多线程管理模型,把线程分成任务执行和线程调度两部分。
    发表于 06-08 14:53 776次阅读
    如何用<b class='flag-5'>C++</b>实现一个<b class='flag-5'>线程</b>池呢?

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程。 多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富的多线程支持,可以轻松地实现
    的头像 发表于 12-01 14:29 485次阅读