多執行緒執行過程分析1 | C#
阿新 • • 發佈:2021-06-28
在使用多個執行緒讀寫同一個變數時,可能會出現與預期不符的情況。
執行緒的執行順序每次都可能不一樣,因為順序由作業系統排程順序決定。
//多執行緒讀寫測試函式 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