多线程执行过程分析1 | C#
在使用多个线程读写同一个变量时,可能会出现与预期不符的情况。
线程的执行顺序每次都可能不一样,因为顺序由操作系统调度顺序决定。
//多线程读写测试函数
private static void MultiThreadsRW()
{
int i;
i = 0;
Thread t1 = new Thread(new ThreadStart(() =>
{
int j=5;
while (j--!=0)
{
i++;
WriteLine($"{i} (t1)");
}
}));
Thread t2 = new Thread(new ThreadStart(() =>
{
int j=5;
while (j--!=0)
{
i++;
WriteLine($"{i} (t2)");
}
}));
t1.Start();
t2.Start();
WriteLine(i);
}
执行过程分析:
执行结果:
(前面数字为i的输出值,括号中是线程的编号)
执行过程:
i的初始值为0
- t2线程中执行i++,并输出i的值i=i+1=0+1=1
- t1线程中执行i++,没有输出,t2执行i++,即此时i=i+2=1+2=3,并输出
- t2中执行i++,此时i=i+1=3+1=4,由t2输出
- & 5. 同3.,执行完后i=6
- 调度主线程输出未改变的i值(读取i时还未被其他线程修改)
- t1线程沿步骤2中的暂停点继续执行,输出i++后的值(此处的i值还是步骤1执行完后的值),i=i+1=1+1=2
- t1线程读取i值(此时全局的i=6),执行i++,i=i+1=6+1=7
- & 10. & 11. 同步骤8,i++执行3次同时输出(8,9,10),最后一次:i=i+3=7+3=10,输出10