多线程下vector拷贝崩溃原因解析:未触发扩容为何崩溃?
为什么未触发vector扩容时,拷贝操作仍会崩溃?
你这段代码里已经通过v.reserve(100)确保vector不会触发扩容(数据缓冲区的指针始终不变),但后台线程持续执行push_back和pop_back修改元素数量,前台线程拷贝vector时依然崩溃,核心原因是vector的拷贝构造不是原子操作,存在竞态条件导致的越界访问。
具体内部过程拆解:
- 标准库中
vector的拷贝构造逻辑大致是:先读取原vector的size值,分配一块能容纳size个元素的新内存,然后从原vector的数据指针开始,复制size个元素到新内存。 - 问题就出在这几步操作不是原子的:前台线程刚读取完
size(比如此时是17),还没完成所有元素复制,后台线程就执行了pop_back,把size改成了16。这时候前台线程还会按照之前读到的17去复制元素,相当于去访问原vector中已经不属于有效范围的第17个元素,触发内存越界,直接崩溃。
至于你提到的其他操作没崩溃,是因为:
v[0]、*v.begin()始终访问的是第一个元素,只要size不小于1就不会越界,而你的代码里size最小是1,所以不会崩;*v.end()本身是C++标准定义的未定义行为,只是你的测试环境刚好没触发崩溃,不代表安全;- 读取
size或者v.end()-v.begin()只是单次读操作,最多得到错误的数值,不会直接触发内存访问错误。
内容的提问来源于stack exchange,提问作者Linhh
相关产品推荐
相关产品推荐

