c++最佳实践|5.可移植性及多线程(代码片段)

程序员编程指南 程序员编程指南     2022-10-24     613

关键词:

本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代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[2]就是关于从动态模块加载的共享静态数据的销毁顺序的。

共享指针

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[3]

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

微信公众号:DeepNoMind

参考资料

[1]

C++ Best Practises: https://lefticus.gitbooks.io/cpp-best-practices/content/

[2]

Problem with C++ unique symbols in plugins: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66830

[3]

GotW #6a Solution: Const-Correctness, Part 1: http://herbsutter.com/2013/05/24/gotw-6a-const-correctness-part-1-3/

[4]

C++最佳实践之安全性: https://www.mdnice.com/writing/210940dd994a4b76930359652864bca3

- END -

点击阅读原文加入知识星球

c++最佳实践|6.性能(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第六篇。C++最佳实践:1.工具2.代码风格3. 安全性4. 可维护性5. 可移... 查看详情

c++最佳实践|1.工具(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第一篇。C++最佳实践:1.工具(本文)2.代码风格3. 安全性4. ... 查看详情

c++最佳实践|1.工具(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第一篇。C++最佳实践:1.工具(本文)2.代码风格3. 安全性4. ... 查看详情

c++最佳实践|2.代码风格(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第二篇。C++最佳实践:1.工具2.代码风格(本文)3. 安全性4. ... 查看详情

c++最佳实践|2.代码风格(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第二篇。C++最佳实践:1.工具2.代码风格(本文)3. 安全性4. ... 查看详情

c++最佳实践|3.安全性(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第三篇。C++最佳实践:1.工具2.代码风格3. 安全性(本文)4. ... 查看详情

c++最佳实践|4.可维护性(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第四篇。C++最佳实践:1.工具2.代码风格3. 安全性4. 可维护性(本... 查看详情

c++最佳实践|3.安全性(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第三篇。C++最佳实践:1.工具2.代码风格3. 安全性(本文)4. ... 查看详情

c++最佳实践|3.安全性(代码片段)

...版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第三篇。C++最佳实践:1.工具2.代码风格3. 安全性(本文)4. ... 查看详情

线程池最佳实践(代码片段)

简单演示一下如何使用线程池privatestaticfinalintCORE_POOL_SIZE=5;privatestaticfinalintMAX_POOL_SIZE=10;privatestaticfinalintQUEUE_CAPACITY=100;privatestaticfinalLongKEEP_ALIVE_TIME=1L;publicstaticvoidmain(String[]a 查看详情

c++线程的使用(代码片段)

...方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高。C++11中提供的线程类叫做std:: 查看详情

可移植的 C++ 多线程

】可移植的C++多线程【英文标题】:PortableC++multithreading【发布时间】:2012-04-2014:03:13【问题描述】:我正在用C++语言编写一个使用多线程的库。由于我是在windows中开发的,所以我使用的是“Windows.h”中的方法和数据结构(如Crea... 查看详情

在 C++ 中将指针表示为字符串的最佳可移植方式是啥?

】在C++中将指针表示为字符串的最佳可移植方式是啥?【英文标题】:What\'sthebestportablewaytorepresentpointerasstringinC++?在C++中将指针表示为字符串的最佳可移植方式是什么?【发布时间】:2009-06-0320:35:41【问题描述】:我需要将指针... 查看详情

将#defines 从 .h 文件移植到 C# 应用程序的最佳实践是啥?

】将#defines从.h文件移植到C#应用程序的最佳实践是啥?【英文标题】:Whatisthebestpracticeforporting#definesfrom.hfiletoaC#application?将#defines从.h文件移植到C#应用程序的最佳实践是什么?【发布时间】:2011-03-2422:23:10【问题描述】:我正在... 查看详情

linux网络编程基础及多线程并发案例(代码片段)

目录1.ip:端口 TCP/IP协议   2.socket头文件  sys/socket.h     3.字节序4.ip地址转换函数5.sockaddr和sockaddr_in6.服务器端基本函数bind listenaccept7.客户端基本函数  connect8.send和recv 8.多线程9.通信流程10.多线程并发样例程序 1.ip:端口 ... 查看详情

制作容器镜像的最佳实践(代码片段)

...的关于镜像制作的相关文章总结出来的.包括通用的容器最佳实践,java,nginx,python容器最佳实践.最佳实践的目的一方面保证镜像是可复用的,提升DevOps效率,另一方面是为了提高安全性.希望对各位有所帮助.本文分为四部分内容,分别... 查看详情

c++智能指针最佳实践&源码分析(代码片段)

...景下。本文将介绍智能指针可以解决的问题,用法及最佳实践。并且根据源码分析智能指针的实现原理。一、为什么需要使用智能指针1.1内存泄漏C++在堆上申请内存后,需要手动对内存进行释放。代码的初创者可能... 查看详情

c++线程的使用(代码片段)

...发程序时,存在诸多的不便。现在C++11中增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线 查看详情