C++中std::vector<uint64_t>读写不相交元素是否存在数据竞争?
代码是否存在数据竞争或未定义行为?
结论:这段代码不存在数据竞争和未定义行为,原因如下:
数据竞争的核心判定条件是「两个线程同时访问同一内存位置,且至少一个是写操作,无同步机制」。这里线程1仅读取vector的前5个元素,线程2仅修改后5个元素,两者操作的内存区域完全不重叠,没有共享的内存位置被同时读写,因此不满足数据竞争的触发条件。
关于编译器/CPU的指令重排:重排只会在不破坏单线程语义的前提下进行,由于两个线程操作的内存完全独立,重排不会导致跨线程的语义混乱。线程内部的指令重排不会影响另一个线程的操作逻辑,因为两者的内存访问没有交集。
额外前提:代码中
vec.resize(10)是在两个线程启动前执行的,这确保了vector的内存空间已经固定,前5个和后5个元素的内存位置不会再发生变化,不存在因vector扩容导致的内存地址变更问题。
内容的提问来源于stack exchange,提问作者LimingFang
相关产品推荐
相关产品推荐

