zoukankan      html  css  js  c++  java
  • System.Threading.Interlocked.CompareChange使用

     1 class CompareChange
     2     {
     3         private static int i = 0;
     4         public static System.Threading.AutoResetEvent changeSignal = new System.Threading.AutoResetEvent(false);//同步信号
     5 
     6         public static void test()
     7         {
     8             ThreadSafe ts = new ThreadSafe();
     9 
    10             System.Threading.ThreadPool.QueueUserWorkItem((obj) =>
    11             {
    12                 Console.WriteLine("modifying-thread is waiting for signal");
    13                 CompareChange.changeSignal.WaitOne();
    14                 Console.WriteLine("modifying-thread received the signal");
    15                 CompareChange.i++;
    16                 ts.Total = CompareChange.i;
    17                 Console.WriteLine("modifying-thread modify the CompareChange.i");
    18                 CompareChange.changeSignal.Set();
    19                 Console.WriteLine("modifying-thread send the complete signal");
    20             });
    21 
    22             System.Threading.ThreadPool.QueueUserWorkItem((obj) =>
    23             {
    24                 ts.AddToTotal(20);
    25             });
    26             
    27             Console.ReadLine();
    28         }
    29     }
    30 
    31     public class ThreadSafe
    32     {
    33         // totalValue contains a running total that can be updated 
    34         // by multiple threads. It must be protected from unsynchronized  
    35         // access. 
    36         private int totalValue = 0;
    37         private int times = 0;
    38         // The Total property returns the running total. 
    39         public int Total
    40         {
    41             get { return totalValue; }
    42             set { totalValue = value; }
    43         }
    44 
    45         // AddToTotal safely adds a value to the running total. 
    46         public int AddToTotal(int addend)
    47         {
    48             int initialValue, computedValue;
    49             do
    50             {
    51                 this.times++;
    52                 if (this.times == 2)
    53                     Console.WriteLine("orignal value has changed.it's the "+this.times.ToString()+"th times to run the process");
    54                 // Save the current running total in a local variable.
    55                 initialValue = totalValue;
    56 
    57                 Console.WriteLine("sending the modifying signal");
    58                 CompareChange.changeSignal.Set();
    59 
    60                 // Add the new value to the running total.
    61                 computedValue = initialValue + addend;
    62 
    63                 Console.WriteLine("waiting for modifying-completely signal");
    64                 CompareChange.changeSignal.WaitOne();
    65 
    66                 // CompareExchange compares totalValue to initialValue. If 
    67                 // they are not equal, then another thread has updated the 
    68                 // running total since this loop started. CompareExchange 
    69                 // does not update totalValue. CompareExchange returns the 
    70                 // contents of totalValue, which do not equal initialValue, 
    71                 // so the loop executes again.
    72             } while (initialValue != System.Threading.Interlocked.CompareExchange(
    73                 ref totalValue, computedValue, initialValue));
    74             // If no other thread updated the running total, then  
    75             // totalValue and initialValue are equal when CompareExchange 
    76             // compares them, and computedValue is stored in totalValue. 
    77             // CompareExchange returns the value that was in totalValue 
    78             // before the update, which is equal to initialValue, so the  
    79             // loop ends. 
    80             Console.WriteLine("process is over");
    81             // The function returns computedValue, not totalValue, because 
    82             // totalValue could be changed by another thread between 
    83             // the time the loop ends and the function returns. 
    84             return computedValue;
    85         }
    86     }

    运行结果:

    modifying-thread is waiting for signal
    sending the modifying signal
    waiting for modifying-completely signal
    modifying-thread received the signal
    modifying-thread modify the CompareChange.i
    modifying-thread send the complete signal
    orignal value has changed.it's the 2th times to run the process
    sending the modifying signal
    waiting for modifying-completely signal
    process is over

  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/javaleon/p/3921633.html
Copyright © 2011-2022 走看看