首页 | 归档 | 分类 | 标签 | 关于 |
|
多核时代,程序员们为了系统运行效率做了很多事情。并发、多线程是其中绕不开的一个话题,有了多线程,随之而来的就是线程之间的同步,临界区的出现,然后就是锁的使用。程序员随之发现锁的开销较大,于是有了缩短临界区话题,尽可能的让临界区变得更小一点。但是总归临界区的缩小是有限度的,也就是有天花板的。因此我们开始探索原子操作,无锁化编程。于是为了功能正常的情况下,还要保证良好的效率,本文探讨原子操作的背后,内存的组织形式,编译器、cpu 的执行顺序,语言为 c++ 语言。
c++11 标准提出了内存模型,而在 c++11 之前,c++ 本身没有多线程的概念,c++ 使用者使用的是操作系统为我们提供的多线程、原子操作。那时的编译器和处理器认为系统中只有一个执行流。但在多线程之后,编码变难了,开发者编写的代码和最终运行的代码之间往往存在较大的差异,而运行的结果与开发者预期的一致,只是表现而已。
那么产生差异的原因主要来自于如下三个方面:
本文测试代码的环境为:x86-64,ubuntu22.04,gcc7.5.0
先使用一段代码引入本文所要探讨的主题。
1 | class X {}; |
如上的代码也是虚继承解决菱形继承中命名冲突和冗数据的问题。虚继承的目的是让某个类做出声明,承诺愿意共享他的基类。这个被共享的基类就称为虚基类。
json 格式方便易用,性能一般。纯文本,容易阅读,方便编辑,适用性最广
推荐库实现:https://github.com/nlohmann/json。功能完善、使用方便
二进制格式。性能比 JSON 好。比如 redis 就使用它。小巧高效,在开源界接受程度比较高
二进制数据格式,工业级产品。是工业级的数据格式,注重安全和性能,多用在大公司的商业产品里