C语言多线程中用全局变量同步函数调用是否存在数据竞争?
多线程环境下该全局变量同步实现的问题分析
结论:这个实现会引发数据竞争,并且存在未定义行为
具体原因:
- 普通
bool类型的变量global_var,其读写操作并非原子操作(C/C++标准未保证普通bool的原子性)。当多个线程同时对它进行读写时,必然会产生数据竞争,而数据竞争直接导致程序行为进入未定义状态。 - 同步逻辑完全失效:假设有两个线程A、B同时进入
task函数,此时global_var为0,两个线程都会退出while(global_var)循环,接着同时执行global_var=1,最终并发调用foo()——这彻底违背了你想让foo()串行执行的初衷。 - 编译器优化风险:由于没有任何同步语义,编译器可能会把
while(global_var)优化成死循环(编译器会默认认为没有其他线程能修改这个变量),导致线程永远无法退出循环执行后续逻辑。
正确的替代方案:
要实现foo()的串行调用,应该使用标准的同步原语,比如POSIX环境下的pthread_mutex_t,或者C++11及以后的std::mutex。这些同步机制能保证操作的原子性和内存可见性,彻底避免数据竞争和未定义行为。
内容的提问来源于stack exchange,提问作者Ahmed Kamal
相关产品推荐
相关产品推荐

