C++23多线程应用中std::start_lifetime_as与未定义行为(UB)的探讨
跨线程对同一块内存调用不同类型的
std::start_lifetime_as是否属于未定义行为? 是否属于未定义行为?
是,这种场景明确属于未定义行为(UB)。
C++标准的相关规定
- 对象生存期的排他性:C++标准规定,同一块内存区域在同一时刻只能关联一个(或同类型数组)对象的生存期。
std::start_lifetime_as<T>的作用是在指定内存中启动T类型对象的生存期,本质上等同于在该内存中创建T类型对象。跨线程对同一块内存分别启动X和Y类型的生存期,相当于试图让同一块内存同时属于两个不同类型的对象,直接违反了对象模型的核心规则。 - 数据竞争条款:标准明确指出,若两个线程对同一内存位置执行非原子操作,且至少一个是写入操作(启动对象生存期属于修改内存的写入操作),同时没有任何同步机制(比如互斥锁、原子操作)来约束执行顺序,就会触发数据竞争,而数据竞争直接导致未定义行为。
std::start_lifetime_as本身不提供同步语义,因此这种跨线程无同步的操作必然触发UB。
若标准未直接提及该场景的解读方式
即使标准没有直接针对“跨线程调用不同类型std::start_lifetime_as”的场景做明文规定,也可以通过标准的核心原则推导结论:
- 从对象模型角度:对象的生存期具有排他性,同一块内存不能同时被两个不同类型的对象占据,这是C++对象模型的基础前提。
- 从并发模型角度:无同步的跨线程写入操作(包括对象创建类操作)必然构成数据竞争,而数据竞争的后果就是未定义行为,这是C++并发模型的核心规则。
内容的提问来源于stack exchange,提问作者markt1964
相关产品推荐
相关产品推荐

