关于线程并发访问全局变量问题

来源:互联网 发布:奢侈品折扣店知乎 编辑:程序博客网 时间: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