pthread_rwlock系列函数是pthread库的读写锁函数。随着版本的不同,它的实现也不同。
本篇的组织是:
- 前置知识
- GCC的扩展内联汇编
- Futex
- 2.17和2.30两个版本的lowlevellock的实现
- 2.17和2.30两个版本的pthread_rwlock的实现
我们的结论是:
旧版GLIBC使用lowlevellock实现pthread_rwlock;
新版GLIBC使用原子操作实现pthread_rwlock。
因此具有不同的ABI
pthread_rwlock系列函数是pthread库的读写锁函数。随着版本的不同,它的实现也不同。
本篇的组织是:
本文介绍在一个较老的环境下编译 V8 引擎,并全静态地链接到既有的游戏服务上。原因是我们需要一个很新的能支持 WebAssembly 的 JS 引擎。经过调研,我们认为使用 V8 是最好的。
游戏服务使用 GCC4.4.6,这是一个非常老的版本,甚至不能完整支持 C++11 标准。而即使是很老版本的 V8 都需要完整的 C++11 支持(GCC 4.8+)。进一步地,最新版本的 V8 需要 C++14 标准的支持:
std::remove_cv_t 的 C++14 的标准库函数因此我们的方案是将游戏中对 V8 强依赖的模块升级成 C++14 标准,主要步骤如下:
下面的一些 git 命令,在使用时常常不知所以,容易混淆,其实原因是对 git 的机制并不了解,因此在本文中介绍相关。
reset hard/soft/mixed
1 | $ git reset --hard |
fetch/pull
1 | $ git fetch |
reset/revert
diff cached/HEAD
1 | $ git diff --cached |
rev-list/log
本文讲解SVN从源码的构建流程,和其中遇到的一些问题。
Sentinel(哨兵)监控Redis集群中Master状态,是Redis 的高可用性解决方案。它监视一系列Master-Slave集群(和其他Sentinel)。当某个Master下线时,自动将该Master下的某个Slave升级为Master。
Sentinel的代码阅读难度相对较大,这是因为它是时钟驱动的一个状态机,所以在逻辑上有点不是很连贯。
本文使用的版本和Redis底层对象实现原理分析这篇文章是相同的。有一些基础知识也在这篇文章中列出。
本篇将主要结合CSAPP介绍ELF文件的格式,常用的分析工具如objdump和readelf,以及Linux程序链接和装载的流程。
讨论Spark上分布式机器学习库的实现。
Spark的机器学习库主要分为ml和mllib,其中ml较新,本文主要围绕ml来讲。
ml和mllib底层会用到Breeze库(类似于numpy的线性代数库)和BLAS(Basic Linear Algebra Subroutines,更基础的线性代数库),在这里也进行介绍。
由于疫情因素,原本的深圳之行最终改为了福州之行。我们分别从深圳和无锡出发,在福州站汇合。
微软的 Office 系列具有非常厉害的技术,但产品具有极高的学习成本,例如在查找替换这一项,它不支持标准的正则表达式(毕竟是 wysiwyg 嘛,也要考虑样式),但不是基于正则表达式定制,而是自己另辟蹊径,这就有点让人难受了。而内置的 Word VBA 的相关文档和 Demo 又很少,基本要靠录制宏来现学现卖,而录制宏生成的代码过于 adhoc,难以泛化,所以这时候借助于 Python 来处理相关文档就显得比较有意义。
以第三方接入的视角,讲解OAuth2.0协议。