多线程——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         }

  

posted on 2017-03-21 18:04  yuekong2010  阅读(2896)  评论(0编辑  收藏  举报