多線程——i++的坑


  在使用socket編程的時候發生數據丟失問題,一直以為是網絡原因,后來測試后發現是多線程操作同一數據源又未加入數據鎖導致。

  直接上代碼,下面程序執行的結果可能出現198、199、200。兩個線程統一時間讀取iCount的值,各自計算完累加,再把值重新寫入到iCount,當這種情況發生時,一個i++就漏掉了,從而導致最終值的不確定性。

 1         private int iCount = 0;
 2         private void main()
 3         {
 4             Thread thread_iCountAdd1 = new Thread(iCountAdd);
 5             Thread thread_iCountAdd2 = new Thread(iCountAdd);
 6             thread_iCountAdd1.Start();
 7             thread_iCountAdd2.Start();
 8         }
 9         private void iCountAdd()
10         {
11             for(int iTemp = 0; iTemp < 100; iTemp++)
12             {
13                 iCount++;
14             }
15         }

  解決辦法是加鎖,代碼如下:

 1         private int iCount = 0;
 2         private object iCountObject = new object();
 3         private void main()
 4         {
 5             Thread thread_iCountAdd1 = new Thread(iCountAdd);
 6             Thread thread_iCountAdd2 = new Thread(iCountAdd);
 7             thread_iCountAdd1.Start();
 8             thread_iCountAdd2.Start();
 9         }
10         private void iCountAdd()
11         {
12             for(int iTemp = 0; iTemp < 100; iTemp++)
13             {
14                 lock (iCountObject)
15                 {
16                     iCount++;
17                 }
18             }
19         }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM