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         }

      

  • 相关阅读:
    完全背包
    二分求值(二分适合求答案在两个数之间的题目)
    set<pair<int,int> >的用法
    01背包 (dp专题)
    矩阵快速幂
    BZOJ1977 [BeiJing2010组队]次小生成树 Tree
    BZOJ1854 [Scoi2010]游戏
    BZOJ1054 [HAOI2008]移动玩具
    NOIP系列复习及题目集合
    BZOJ2708 [Violet 1]木偶
  • 原文地址:https://www.cnblogs.com/yuekong2010/p/6595923.html
Copyright © 2011-2022 走看看