多线程并发题目
又一个全局变量tally,和两个线程并发执行(代码段都是ThreadProc):
问连个线程都结束后,tally取值范围
int tally=0;//glable
void ThreadProc()
{
for(int i=1;i<=50;i++)
tally+=1;
}
//end
又一个全局变量tally,和两个线程并发执行(代码段都是ThreadProc):
问连个线程都结束后,tally取值范围
int tally=0;//glable
void ThreadProc()
{
for(int i=1;i<=50;i++)
tally+=1;
}
//end
正确答案是50-100
1:tolly += 1 可以拆成两条原子运算,一个加法,一个赋值
加法只在本线程有效,赋值是全局的,所以 eax 的值不是share的,
只有tolly的值是share的。
2:两个线程的调度是无规则的不是对称的,不能假设对称划分时间片。
有个规则:
被A侵消的B对tolly的变化的贡献, delta(连续次数) * 1, 总是可以找到
一个序列,用A比B晚执行的次数的自增所补回。
假设,B 已经跑完,A 还要自增 n 次,那么 tolly 的最终值是
n的增函数。