You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中未触发的数据竞发生场景是否会导致程序行为未定义?

数据竞争与未定义行为的边界问题

以下C++程序存在潜在的数据竞争:

#include <iostream>
#include <thread>
#include <chrono>
#include <string>

using namespace std::chrono_literals;

int sharedVar = 42;

void func(const std::string& threadName) {
    int input;

    while(true) {
        std::cout<<"["<<threadName<<"]Enter a number: "<<std::endl;
        std::cin>>input;

        if(input == 42) {
            sharedVar++;
        }
        else {
            std::this_thread::sleep_for(1s);
        }
    }
}


int main() {

    std::thread t(func, "thread");
    t.detach();

    func("main");
}

当用户输入42时,两个线程会在无同步机制的情况下访问sharedVar。根据C++标准定义:

若发生数据竞争,程序行为未定义。

核心问题

若用户从未输入42,上述程序是否能保证正常运行(无未定义行为)?还是说无论运行时是否输入42,程序始终存在未定义行为?

补充说明

相关技术文章的结论指出:输入内容不影响程序的未定义行为属性。此外,本例涉及第二类函数(Type 2 Functions)——这类函数是否引发数据竞争取决于运行时输入或外部因素。


结论

无论运行时用户是否输入42,程序的行为始终是未定义的。

原因在于C++标准对数据竞争的判定逻辑:只要程序中存在可能导致数据竞争的执行路径,而非实际运行时是否触发了该路径,就会被判定为存在数据竞争,进而导致整个程序行为未定义。本例中,输入42的分支是合法的执行路径,即使从未被执行,程序依然因存在潜在竞争路径而符合“数据竞争”的判定条件,行为未定义。

对于第二类函数,C++标准并不因其竞争的触发具有条件性而网开一面——只要函数存在可能引发竞争的分支,包含该函数的程序就会被认定为存在数据竞争,行为不受标准保障。

内容的提问来源于stack exchange,提问作者Vishal Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:40:25