zoukankan      html  css  js  c++  java
  • 多线程——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         }

      

  • 相关阅读:
    BZOJ2759 一个动态树好题
    BZOJ3527 力
    HDU6069 String
    HDU5069 Harry And Biological Teacher
    AC自动机初步
    HDU6155 Subsequence Count
    while与until
    RADI
    linux压缩及归档
    挂载与卸载
  • 原文地址:https://www.cnblogs.com/yuekong2010/p/6595923.html
Copyright © 2011-2022 走看看