众所周知 C++ STL 容器是不保证线程安全的,不过对于 vector
, list
这类容器来说,由于其底层实现很简单直接,我们可以较为容易地分析出什么时候多线程并发操作时可以不用加锁,什么时候需要加锁 —— 一般来说纯粹的并发读操作是可以不用加锁的。
然而 string
是个很奇特的异类,在 5.x 之前的老版本 GCC 上,由于 string
的实现使用了 COW 优化,这使得 string
的线程安全问题变得极为玄学。这也是 GCC 5.x 后引入了新的 string
实现放弃了 COW 的重要原因之一。
本文就来讨论下 string
在 COW 机制下线程安全方面的一些坑。