printf 原理探讨

来源:互联网 发布:阿里云手机端 编辑:程序博客网 时间:2024/05/21 08:43

今天看到一个笔试题,觉得有必要讨论一下,顺便可以把printf 的原理搞的更清楚一点。

题目如下:两个线程并发执行以下代码,假设a是全局变量,那么以下输出中___是不可能的。

void function()

{

    a = 5;

    a = a + 1;

    printf("%d_",a);

}

A. 5_6_    B. 6_5_    C. 6_7_    D. 7_6_

 

讨论:

A和C是比较明显的,不再讨论;B和D选项需要明确printf的原理才可以详细解释。

首先讨论B,当前问题是:如果出现先输出6后输出5的情况,那么printf一定非原子操作,即当1(线程1,下同)将要执行printf时,2(线程2,下同)执行a=5,此时1将a压入printf但还未输出,此时2执行结束输出6,1完成最后输出5的工作;

对于选项D,当1和2都完成a=5后,1执行a=a+1并将6压入printf但是为输出,此时2执行剩下代码输出7,然后1完成剩下工作输出6;

对于BD的讨论采用将printf当做两个步骤来执行,首先是压入数值,其次是输出,但是是否正确,仍需考虑printf原理!

 

 

printf原理:待续