关于线程安全


线程安全

在编程的世界里,谈论线程、进程、锁、信号量等概念的程序员们可能口若悬河,甚至能够深入解析处理器同步、原子操作、屏障等高级技术。然而,理论与实践之间存在着微妙的鸿沟,尤其是将这些抽象概念应用于实际编程中时。不加思考地使用锁或是过于自信地认为无需上锁,都可能导致程序在多线程环境下出现不稳定的问题。特别在涉及外部库时,理解这些库的线程安全性至关重要。

CPython3.12 版本前都强制启用了全局解释器锁( GIL ),来保障解释器的顺序执行,但这不是为各位程序员准备的线程安全特效药,特别是在调用包含 C 绑定的第三方库时。 GIL 的存在使得不加思考地进行多线程编程变得危险,在不了解第三方库所提供的线程安全保障的情况下随意地敲出代码可能导致程序的不稳定,甚至是出人意料的崩溃,这种情况下 Python 的错误日志通常无法警示开发者程序崩溃的真正原因,也经常就没有错误日志。

比如常用的向量数据库方案 faiss-cpufaiss-gpu 的插入操作都是线程不安全的。对于没有细致考虑二者区别的开发者而言,它们用起来可能与 map 别无二致,从而误入陷阱。最终,用户可能会面临程序不可预测的崩溃。而尸检却发现没有任何错误输出,为诊断和修复带来极大的困扰。