首页 > 其他分享 >多线程循环控制字段失效造成死循环的坑

多线程循环控制字段失效造成死循环的坑

时间:2024-05-14 11:44:12浏览次数:26  
标签:缓存 flag 循环 线程 printf 失效 多线程 死循环

编程的时候遇到一个场景:

  A,B两个线程,B是一个while(flag),有个控制字段flag,刚开始是true

  B会一直循环,A某个情况回把flag置为false,但是如果B的循环里什么都没干,就一直不退出,陷入死循环

  本来以为是哪里逻辑写错了,于是在B里面加入了一个printf,没想到结果就能正常退出了

 

当时觉得很奇怪,推测可能是cpu的原因,因为cpu死循环时候占用率100%可能无法更新缓存中的内容,

推测调用printf修复的原因是printf进行系统调用后刷新了缓存。

不过后来学习后发现x86架构没有invalid队列,A线程更改flag刷入内存后,B线程应该能立马感知到变化,并让本地缓存失效

 

最后咨询了同事,发现是编译器的问题。

如果循环里什么都不写,就会先获取flag到寄存器,以后每次循环判断时直接比较寄存器的值

 如果循环里加上一些东西,或者flag加上volatile关键字,就不会有这个问题,循环判断每次都取内存的值

 

标签:缓存,flag,循环,线程,printf,失效,多线程,死循环
From: https://www.cnblogs.com/bennettz/p/18190984

相关文章

  • N1CTF2018 shopping:多线程堆题中堆溢出的应用
    介绍一种在多线程堆题中利用堆溢出达成任意地址分配的手法。我们知道,一个进程的主线程的堆管理main_arena在libc中,分配的chunk在堆段中。那么子线程的arena和堆块都在哪里呢?这一大串在libc前面一点点的anon就是给子线程留的arena和堆空间。arena和tcache管理chunk在这个内存段......
  • C#异步与多线程
    c#的异步与多线程异步与多线程首先,异步是相对于同步的一个概念,在同步环境下,程序允许至某处需要等待的位置,会发生阻塞,直到达到条件才会继续向下运行;而异步操作则可以在需要等待的位置,跳过等待,执行其他内容,通常异步处理的事务不能相互存在影响。多线程指的是,同时使用多个线程执行......
  • mybatis多线程插入数据表已经事务回滚
    importlombok.extern.slf4j.Slf4j;importorg.apache.commons.collections4.CollectionUtils;importorg.apache.commons.collections4.ListUtils;importorg.apache.ibatis.session.ExecutorType;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibati......
  • mybatisPlus多数据源的使用&使用 lambdaQuery 导致多数据源失效
    依赖<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.2</version></dependency>配置文件:spr......
  • C#多线程
    目录C#线程概述定义程序、进程、线程基本语法C#可以通过Thread、ThreadPool、Task(推荐)创建线程。前台线程和后台线程共享数据保护机制优缺点/应用场景优缺点常见的应用场景总结C#线程概述定义线程(thread)是计算机科学中将进程划分为两个或多个线程(实例)或子进程,由单处理器(单线程......
  • gitignore失效情况处理
    参考:https://blog.csdn.net/weixin_36977069/article/details/130871529基本就是转载,我怕作者后期删了,这边做个记录 解决方法:git清除本地缓存(改变成未track状态),然后再提交:gitrm-r--cached.gitadd.gitcommit-m‘update.gitignore’gitpush-uoriginmaster......
  • 无限for循环(死循环)
    -今天看到一个有意思的for循环:for(;;){}leta=[1,2,3];letindex=0;for(;;){letval=a[index++];console.log(val);if(val===undefined){break;}}for(;;)是一个无限循环,也称为“死循环”。它的三个表达式(初始化表达式、条件表达式、更新表达......
  • 多线程应用
    importtimeimportthreadingdeffunc_one(name):fornuminrange(1,6):print(f"{name}第{num}次执行")time.sleep(1)deffunc_two(name):fornuminrange(1,6):print(f"{name}第{num}次执行")time.sleep(1......
  • 爬虫多线程代码调试
    第一次调试fromthreadingimportThreadfromfake_useragentimportUserAgentimportrequestsfromtimeimportsleepforiinrange(1,11):url=f"https://www.hupu.com/home/v1/news?pageNo={i}&pageSize=50"headers={"User-......
  • C#实现多线程的几种方式
    思维导航前言多线程常用场景什么是进程?什么是线程?使用Thread类使用ThreadPool类使用Task类使用Parallel类拾遗补漏合集DotNetGuide技术社区交流群前言多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提......