1. 程式人生 > 其它 >多執行緒執行過程分析1 | C#

多執行緒執行過程分析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

  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