进程和线程有关题目

 卷首语:君子藏器于身,待时而动。只有不断积累、负重前行,才能每天都遇见更优秀的自己。本篇博客将持续更新中······

线程是程序执行流的最小单元,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。

 一、两个等价线程并发的执行下列程序,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

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/81427860