首页 > 试题广场 >

结束后,tally取值范围为?

[单选题]
一个全局变量tally,两个线程并发执行(代码段都是ThreadProc),问两个线程都结束后,tally取值范围为_______
int tally=0;//全局变量
  void ThreadProc(){
     for(int i=1;i<=50;i++)
          tally+=1;
}
  • [50,100]
  • [100.100]
  • [1275,2550]
  • [2550,2550]
推荐
A
最小值的情况:(线程a,b交替读取tally值)
a线程对tally加1后,还没有更新tally在内存中的值,线程b读取tally值,执行加1,更新tally为1,然后a线程重新读取tally值,这样交替运行,最终为50
最大值的情况:
a线程对tally加到50后,更新tally在内存中的值为50,然后线程b读取tally值,再执行加50运算,结果为100;
编辑于 2015-12-15 10:54:28 回复(1)
这题是tally+=1;竟然把1看成了i。。。
发表于 2015-11-04 19:43:13 回复(18)
这道题是考察视力的。
发表于 2016-09-01 10:09:33 回复(0)
假设线程一抢先获得CPU的执行权,线程一首先读取i的值,准备常数1,与i进行加法操作,这时CPU执行时间到,线程二获得CPU的执行权,与·线程一做同样的操作,并把i写入1,线程一又获得CPU的执行权,之前只剩下写入操作,因此不会进行加操作,将i写入1,若50次都是如此,便获得最小值
发表于 2021-03-20 21:29:59 回复(0)
<p>A,最小是当两个线程在循环中都同一时间点执行时,为50,当两个线程都在不同时间点执行时为最大100</p>
发表于 2020-06-05 08:20:21 回复(0)
没有使用volatile的全局变量会让线程直接在局部变量缓存中计算和。结果取决于两个进程读写共享内存的时间(在方法结束时)。最小发生在B启动后于A启动前,先于A结束后。最大发生在B启动后于A结束后。
发表于 2017-02-23 18:15:41 回复(1)
看错了,是total=total+1;郁闷!!!那么因为锁定义的变量并未声明为volatile,所以,total值可能会在下一个线程调用时仍然没来得及变化。
发表于 2015-12-15 01:09:48 回复(0)
A 两个线程同时访问变量各50次,变量会做50-100次+1运算
发表于 2015-11-04 16:22:14 回复(0)
两个线程同时访问50次,变量做50-100次运算
发表于 2022-01-23 15:21:34 回复(0)
考察视力
发表于 2022-05-19 14:58:16 回复(0)
取值范围最小不是2吗
步骤解析:
  1. a取0
  2. b取0
  3. a+49,将49写入内存
  4. b+1,将1写入内存取代49
  5. a取1
  6. b取1,+49,将50写入内存
  7. a+1,将2写入内存取代50
发表于 2020-08-05 11:39:41 回复(0)
<p>A</p>
发表于 2020-06-06 01:33:52 回复(0)
是因为tally+=1这个操作不是原子性操作,有可能在线程A操作tally这个参数的同时,B线程也在操作tally(如tally:2->3。A线程获取到的tally的初始值是2,B线程获取到的tally的初始值也是2,AB两个线程都是执行赋值为3的操作。所以这样一来,tally在这次操作之后,值为3,并不是4)。
发表于 2019-08-26 15:01:19 回复(0)
考察视力。。。

发表于 2018-09-24 21:40:18 回复(0)
注意,值加一之后得写入内存才算完成。而这是2步,且不是原子操作,可以打断
发表于 2018-03-19 14:05:12 回复(0)
tally 计数器
tally+=1; 不是原子操作
发表于 2017-02-28 20:47:22 回复(0)