关于线程并发访问全局变量问题
来源:互联网 发布:奢侈品折扣店知乎 编辑:程序博客网 时间:2024/06/06 03:28
1.两个线程并发执行以下代码,假设a是全局变量,那么以下输出______是不可能的?void foo(){ ++a; printf("%d ",a);}A、3 2 B、2 3 C、3 3 D、2 2 我想知道D为什么可能出现,个人觉得 AD都不可能呀不好意思漏了条件了 a初始为1
我怎么觉得都可能呢?假设线程x和y同时执行,x和y可随时被抢占,a的初始值为1A:3, 2y先执行++a,a为2;y再执行printf,a入栈,在打印到终端之前切换到xx执行++a,a为3;x执行printf,输出3;再切换到yy执行打印,输出2B:2 3x先执行++a,a为2;x再执行printf,输出2;切换到yy执行++a,a为3;y执行printf,输出3;C:3 3x先执行++a,a为2;切换到yy执行++a,a为3;y执行printf,输出3;切换到xx执行printf,输出3D:2 2类似C,a的初始值为0即可这里关键有两点:(1)两个线程可随时被抢占(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)
ljf10000所说的有些问题,首先printf是原子操作,不会被打断。答案选A。两个线程顺序执行,没有并发,B出现。两个线程先把++a操作执行过后,再执行printf函数,c出现。选项D是假设线程A先执行++a操作但没有写回到内存,这时线程B执行++a操作写回内存并printf,输出2_,线程A继续执行,++a操作写回内存,a的值保持2,再printf2_,所以结果为2_2_;
0 0
- 关于线程并发访问全局变量问题
- 关于线程并发的问题
- Spring并发访问的线程安全性问题
- SpringMVC并发访问的线程安全性问题
- Spring并发访问的线程安全性问题
- Spring并发访问的线程安全性问题
- Spring并发访问的线程安全性问题
- Spring 并发访问的线程安全性问题
- Spring 并发访问的线程安全性问题
- Spring 并发访问的线程安全性问题
- Spring并发访问的线程安全性问题
- Spring并发访问的线程安全性问题
- Spring并发访问的线程安全性问题
- Spring并发访问的线程安全性问题
- Spring 并发访问的线程安全性问题
- Springmvc 并发访问的线程安全性问题
- Spring并发访问的线程安全性问题
- Spring 并发访问的线程安全性问题
- 微软100题-天天做-第29题
- uva 465 Overflow
- SVN的使用方法
- 数据库设计三大范式
- C++多态
- 关于线程并发访问全局变量问题
- Thinkphp事务怎么写?
- 参加.Net培训赢得职场好前景
- Android中动画实现单击按钮控制开屏关屏效果(系统animation实现、scrollTo实现、自定义scrollTo实现)
- 常用js验证码
- JavaScript中带HTML注释?
- MFC使用ADO在Oracle中查重
- Linux常用命令大全
- vs开发插件