多线程执行过程分析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);
}

执行过程分析:

执行结果:
image
(前面数字为i的输出值,括号中是线程的编号)

执行过程:
i的初始值为0

  1. t2线程中执行i++,并输出i的值i=i+1=0+1=1
  2. t1线程中执行i++,没有输出,t2执行i++,即此时i=i+2=1+2=3,并输出
  3. t2中执行i++,此时i=i+1=3+1=4,由t2输出
  4. & 5. 同3.,执行完后i=6
  5. 调度主线程输出未改变的i值(读取i时还未被其他线程修改)
  6. t1线程沿步骤2中的暂停点继续执行,输出i++后的值(此处的i值还是步骤1执行完后的值),i=i+1=1+1=2
  7. t1线程读取i值(此时全局的i=6),执行i++,i=i+1=6+1=7
  8. & 10. & 11. 同步骤8,i++执行3次同时输出(8,9,10),最后一次:i=i+3=7+3=10,输出10
posted @ 2021-06-28 14:14  windin  阅读(66)  评论(0编辑  收藏  举报