进程学习(3)
来源:互联网 发布:怎么样利用网络挣钱 编辑:程序博客网 时间:2024/06/06 02:45
两个线程并非执行以下代码,假设a是全局变量,输出结果是:
int a=1;void foo() { ++a; printf("%d",a);}
A 3,2 B 2,3C 3, 3 D 2,2
分析:答案是;ABCD
假设线程x和y同时执行,x和y可随时被抢占,a的初始值为1
A:3, 2
y先执行++a,a为2;
y再执行printf,a入栈,在打印到终端之前切换到x
x执行++a,a为3;
x执行printf,输出3;再切换到y
y执行打印,输出2
B:2 3
x先执行++a,a为2;
x再执行printf,输出2;切换到y
y执行++a,a为3;
y执行printf,输出3;
C:3 3
x先执行++a,a为2;切换到y
y执行++a,a为3;
y执行printf,输出3;切换到x
x执行printf,输出3
D:2 2
类似C, 执行++a操作但没有写回到内存
这里关键有两点:
(1)两个线程可随时被抢占
(2)++a和printf不是原子指令,可随时被打断;特别注意函数printf,a作为参数压栈后,a再变化则不会影响输出(printf实际打印的是压栈的参数,是值拷贝的栈变量)
阅读全文
0 0
- 进程学习(3)
- linux学习(3)--进程
- 多进程学习3
- 进程调度学习3
- 进程学习(1)
- 进程学习(2)
- Win32ASM-进程学习[3]-读写进程空间
- 进程学习:3-进程组、会话、守护进程
- Linux进程学习(孤儿进程和守护进程)
- 3 进程 的简单学习
- 进程学习3--getpid&getppid
- Linux常用命令(学习进程)
- 操作系统学习(一) 进程
- Linux 进程学习(三)
- Linux 进程学习(五)
- js学习进程(一)
- JS学习进程(二)
- JS学习进程(三)
- 【Java学习笔记】22.Java的反射机制
- 51nod 1639 绑鞋带
- 渗透之信息收集
- UML类图详解
- nyoj12-喷水装置(二)(贪心)
- 进程学习(3)
- leetcode
- SQL基本语句
- 脚本打包证书基础
- C++ 字符串处理
- Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVers
- 【转】字符串令牌解析
- SQL SERVER添加与删除主键约束
- C++学习(15)