卷首语:君子藏器于身,待时而动。只有不断积累、负重前行,才能每天都遇见更优秀的自己。本篇博客将持续更新中······
线程是程序执行流的最小单元,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。
一、两个等价线程并发的执行下列程序,a为全局变量,初始为0,假设printf、++、--操作都是原子性的,则输出肯定不是哪个?
void foo()
{
if(a <= 0)
{
a++;
}
else
{
a--;
}
printf("%d", a);
}
A 01
B 10
C 12
D 22
关于这类分析,一定要分清楚每一步的具体过程,不仅要知其然还要知其所以然。通读题干,对全局变量a执行的操作主要有3个。
- a<=0,判断语句,从内存取值,不写回内存;
- a++/a--,从内存取值,有对a的赋值,结果要写回内存;
- printf打印a,要从内存取值
1. 线程p1执行完foo( ),线程p2再执行foo( )。结果是10。
2. 线程p1从内存取出a=0,执行if后等待;线程p2从内存取出a=0,执行if后等待;线程p1执行a++,a=1写回内存,等待;线程p2从内存取出a=1,执行a++,a=2写回内存,等待;线程p1,线程p2执行输出,结果为22。
3. 线程p1从内存取出a=0,执行if后等待;线程p2从内存取出a=0,执行if后等待;线程p1执行a++,a=1写回内存,执行输出a=1;线程p2从内存中取出a=1,再执行a++,a变为2,写回内存,继续执行printf输出a=2,结果是12。另一种输出21的结果与之类似。
4. 线程p1从内存取出a=0,执行if后执行a++,a=1写回内存,等待;线程p2执行else,再执行a--,a=0写回内存,最后执行输出a=0;线程p1再执行输出a=0,结果是00。