双线程竞态条件排查:buffer并发访问场景分析求助
单核心386下的并发场景分析
在你提供的单生产者(t1)、单消费者(t2)代码中,单核心386调度器下不会出现t1与t2并发访问buffer的场景,原因如下:
核心逻辑的串行性
代码中两个原子变量的状态切换是严格串行的:
- 初始状态:
buffer_read_complete = true(buffer可写),buffer_write_complete = false(buffer不可读) - t1仅在
buffer_read_complete为true时才会进入写流程,写入前会将其设为false,写完后设置buffer_write_complete = true - t2仅在
buffer_write_complete为true时才会进入读流程,读取前会将其设为false,读完后设置buffer_read_complete = true
在单核心调度器下,线程只能分时执行:
- t1写buffer时,
buffer_read_complete为false,t2循环检查buffer_write_complete会得到false,不会进入读流程 - t2读buffer时,
buffer_write_complete为false,t1循环检查buffer_read_complete会得到false,不会进入写流程
两者的操作完全错开,不会出现同时读写buffer的情况。
load+store写法的潜在问题
你提到的load+store式检查-设置并非原子操作,这个判断是对的,但问题仅会在多生产者或多消费者场景下暴露:
- 若存在多个t1线程,多个线程可能同时读到
buffer_read_complete = true,随后依次将其设为false,最终多个线程同时进入写流程,导致buffer被并发写入 - 若存在多个t2线程,同理会出现多个线程同时读buffer的情况
而compare_exchange_weak是原子的test-and-set操作,能确保同一时间只有一个线程通过检查并进入临界区,完美解决多生产者/消费者场景下的竞态问题。
内容的提问来源于stack exchange,提问作者Marko Vejnovic
相关产品推荐
相关产品推荐

