首页 > 试题广场 >

有两个线程,最初 n=0,一个线程执行 n++; n++;

[不定项选择题]
有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值?
  • 1
  • 2
  • 3
  • 4
// ++ 和 += 都不是原子操作,所有都可能被中断,结果就是 2 ~ 4 都可以

发表于 2017-08-06 15:28:18 回复(0)
针对这种++和--的并行线程:最大值为两个单线程运行结果和两个线程串行运行结果(三个结果)中的最大值,最小值为三者之中的最小值;而可能结果则在最小值和最大值之间(不一定能取到该区间每一个值,因为若操作为i+=2,i-=2,则取不到奇数值)
发表于 2019-04-18 10:59:32 回复(0)

大家要知道 C语言中的 ++ 和 += 并不是原子操作,而是通过多条微程序组成的,因此 ++ 和 += 在执行过程中可能被中断的

  • 第一种可能情况:现在假设两个线程没有并行顺序执行的那么结果显然是 4。
  • 第二种可能情况:再假设现在第一个n++ 已经执行完了  但是结果还没有写回内存 这个时候 n+=2 已经全部执行完 2 写进了内存 结束 然后回到n++的写回操作 这个时候内存就从2被改回1了,后面再来一次n++  结果就为2。
  • 第三种可能情况: 第n+=2 先读取n的值到寄存器 即0入寄存器 这个时候被中断   第一个n++开始执行 并直到结束 内存被改成了1 ,然后 n+=2 继续执行 结束后内存变为2  第二个n++再执行 结果就是3了
发表于 2015-07-02 20:51:02 回复(10)
如前面大佬@琥珀大川说的2-4 可能的原因,我尝试说一下1 为啥不行
一进程执行两次n++, 二进程 n+=2;
无论如何,两个进程都会进行一次读取n的数值,和写回操作。且两个进程都会要运行完自己的程序块。
二进程每次都是+2,不会出现1
一进程虽然两次分开+1,但是只要运行完进程结果就是2,除非运行完第一个n++写回后,n的数值被改回0。显然不会出现这种情况
发表于 2021-01-21 21:18:05 回复(0)
1为什么不行:进程一有两次i++操作,无论如何都会读取两次i,第二次读取的i必不可能为0(因为同一个线程内程序解释一行执行一行,指令交错是发生在多线程环境下的)
编辑于 2022-01-26 10:37:19 回复(0)

为什么这个题不考虑重排序情况呢?当线程执行顺序为n++ N=0 n++

这样最终的结果不就是1嘛

发表于 2019-11-25 11:00:13 回复(0)
n=0,假设现在第一个n++ 已经执行完了  但是结果还没有写回内存,然后执行n++,n+=2,最后回到写回的++操作,内存就由原来的值改成1了,所以结果为1
发表于 2019-05-16 11:09:17 回复(0)
最小的情况是2,最大情况是4,因此结果是2,,,3,,4
发表于 2017-08-02 15:03:57 回复(1)
BCD
发表于 2015-01-06 19:30:32 回复(0)