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
相关产品推荐
相关产品推荐

