美文网首页
C++最佳实践 | 5. 可移植性及多线程

C++最佳实践 | 5. 可移植性及多线程

作者: DeepNoMind | 来源:发表于2022-05-22 10:13 被阅读0次

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

C++最佳实践:

  1. 工具
  2. 代码风格
  3. 安全性
  4. 可维护性
  5. 可移植性及多线程(本文)
  6. 性能
  7. 正确性和脚本

可移植性

明确使用的类型

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

参考: http://www.viva64.com/en/a/0010/

使用标准库

std::filesystem

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

std::thread

C++11的线程功能能够基于pthreadWinThreads使用。

其他

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

多线程

避免全局数据

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

静态(static)数据

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

共享指针

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

单例(Singleton)

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

避免堆操作

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

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

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

  • 可变成员变量被假定为共享变量,因此应该与互斥锁同步(或原子化)。
  • 如果一个成员变量本身是互斥的,那么应该是可变的,这是在const成员函数中使用它所必需的。

更多信息请参阅Herb Sutter的文章: GotW #6a Solution: Const-Correctness, Part 1

也可以参考前面关于const &返回值安全性的讨论。

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

相关文章

  • C++最佳实践 | 5. 可移植性及多线程

    本系列是开源书C++ Best Practises[https://lefticus.gitbooks.io/cp...

  • 照本宣科的问题

    3条你遵循的多线程最佳实践三条最佳实践我觉得大多数Java程序员都应该遵循: 如何避免死锁?Java多线程中的死锁...

  • Java 最佳实践的经验

    Java 最佳实践的面试问题 包含 Java 中各个部分的最佳实践,如集合,字符串,IO,多线程,错误和异常处理,...

  • C++语言学习目录

    第一章 预备知识1.1 C++简介1.2 C++简史1.3 可移植性和标准

  • C++11多线程

    C++11提供了语言级别的多线程,使得多线程编程可移植性提高。使用多线程需要包含头文件#include 创建线程 ...

  • 多线程并发最佳实践

    使用本地变量 使用不可变类 最小化锁的作用域范围:S= 1/(1-a+a/n) 其中,a为并行计算部分所占比例,n...

  • C++ 多线程

    C++ 多线程 | 菜鸟教程 C++ 11 多线程--线程管理 - Brook_icv - 博客园

  • swift - swift 混编C++

    Swift 与 C++混合编程的最佳实践大型 App 由于跨平台的需要,底层一般会采用 C++来实现,当时再往上到...

  • Java 字符串拼接效率分析及最佳实践

    转载请注明出处: Java 字符串拼接效率分析及最佳实践 本文来源于问题 Java字符串连接最佳实践? java连...

  • c++预备知识——可移植性及程序创建技巧

    c++预备知识――可移植性及程序创建技巧 什么是自顶向下,什么是自下向上?结合百度与我的理解:自底向上是从具体到抽...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/dkmmurtx.html