2015-08-14 08:20
中南民族大学 C++ 还有多远:是要考虑并发的情况吧,结果是4当且仅当所有语句顺序执行的时候
结果是6也容易理解:
(1)线程1执行完*x += *x,*x现在变为2
(2)线程1被打断,线程2进入,执行完*x += *x,*x现在变为4
(3)线程2被打断,线程1执行完*y += *x,*z += *y,即得到*z = 6了
注意到右结合操作符+=并非原子操作,结果为5也是可能的:
(1)线程1执行*x += *x,先取右操作数*x,值为1,当取左操作数时被打断,线程2进入
(2)线程2执行完*x += *x,由于此时*x仍然为1,所以得到*x = 2,此时线程2也被打断,线程1继续执行
(3)线程1的+=操作取左操作数*x,值已经是2了,从而写回*x后,*x变为3,接着线程1执行完第二条和第三条语句,就得到*z =
5了
实际上,返回值等于7也是可能的:
(1)线程1执行*x += *x,取右操作数*x,值为1,然后被打断,线程2进入
(2)线程2执行*x += *x,取右操作数*x,值为1,然后被打断,线程1继续
(3)线程1执行完*x += *x,取左操作数*x,值为1,加上1写回*x,*x变为2,然后被打断,线程3进入
(4)线程3执行完*x += *x,此时*x变为4,然后被打断,线程2继续
(5)线程2取左操作数*x,值为4,加上1写回*x,*x变为5,然后被打断,线程1继续
(6)线程1执行完*y += *x,*y变为6,执行完*z += *y,*z变为7
0 点赞 评论 收藏
分享
创作者周榜
更多
关注他的用户也关注了: