Rust和C标准库的线程安全噩梦:ARM64平台上的神秘崩溃

2025-01-22
Rust和C标准库的线程安全噩梦:ARM64平台上的神秘崩溃

EdgeDB团队在将Python网络I/O代码移植到Rust的过程中遭遇了ARM64平台上的神秘崩溃。起初怀疑是死锁,但最终发现是由于`setenv`和`getenv`函数的线程不安全问题导致的。在ARM64环境下,`openssl-probe`库使用`setenv`设置环境变量,而另一个线程同时调用`getenv`,导致`environ`数组被重新分配,最终引发崩溃。解决方法是将reqwest的TLS后端从rust-native-tls切换到rustls。这个案例说明了即使在Rust这种内存安全的语言中,仍然可能因为与C标准库的交互而出现线程安全问题。