首页 > 试题广场 >

竞选条件(race condition)的情况下,两线程执行

[不定项选择题]
竞选条件(race condition)的情况下,两线程执行如下代码段,其中count为共享变量,线程1执行代码段A,线程2指向代码段B,那么变量count的值可能为
int count = 10;
代码段A:
Thread_1()
{
    //do something
    count++;
}
代码段B:
Thread_2()
{
    //do something
    count--;
}

  • 9
  • 10
  • 11
  • 12
如果count声明为volatile类型,则两个线程直接从寄存器获取count的值,而不是先拷贝再赋值,那么最后的结果为10
发表于 2018-10-20 12:10:46 回复(0)
更多回答
推荐
在count没有使用valitale的时候,线程对其的操作是先拷贝一份count为tmp1,然后tmp1变成了11,付给count;线程二拷贝一份count为tmp2,将其变成了9,赋给count;在这个过程中,可能发生:
1.tmp1与tmp2同时由count=10拷贝而来;然后tmp1变成11,tmp2变成9;tmp1先赋给count;tmp2后赋给count,最终count=9;
2.tmp1与tmp2同时由count=10拷贝而来;然后tmp1变成11,tmp2变成9;tmp2先赋给count;tmp2后赋给count,最终count=11;
3.tmp1由count=10拷贝而来,变成了11后赋给了count;tmp2由count=11而来,变成了10后赋给了count。
4.跟3的顺序相反,但是结果依然为10.
因此选ABC
编辑于 2015-09-05 17:33:56 回复(3)
ABC   ++和--并非原子操作,存在被打断的可能性。
A:线程1先执行,++后数据未及时写入内存便被线程2打断,执行完线程2,数据已被更改,输出9
B:顺序正常执行
C:线程2先执行,--后数据未及时写入内存便被线程1打断,执行完线程1,数据已被更改,输出11
发表于 2019-09-16 20:03:51 回复(0)
正确答案:A B C 你的答案:D 😨
发表于 2021-03-16 22:18:23 回复(0)
A与C皆是在数据在buffer内并未真正更新这一临界时刻,另一个进程读数据产生的结果
发表于 2016-04-12 23:08:34 回复(0)
要么先执行线程1,要么先执行线程2,然后根据自增自减运算符得出数来,除了12,其他数都有可能。
发表于 2017-06-11 13:50:51 回复(0)

有没有可能执行完a之后又执行了a,那样就是12了

发表于 2019-09-01 09:26:57 回复(1)
自增不具有原子性
发表于 2019-07-18 14:47:37 回复(0)
竞选条件:要么先运行a,要么先运行b,运行一轮回可能结果
发表于 2017-07-06 21:15:12 回复(0)
又看错了。细心啊。答案应该有9,10,11。不可能出现12。
发表于 2015-12-15 01:13:45 回复(0)
ABC吧
发表于 2015-06-12 10:56:50 回复(0)
ABCD 都有可能吧
发表于 2015-03-13 20:48:39 回复(0)
ABC
发表于 2015-03-11 18:07:17 回复(0)