zoukankan      html  css  js  c++  java
  • 竞态条件

    概述: 如果两个或两个以上的线程同时访问相同的对象,或者访问不同步的共享状态.就会出现竞态条件

    举例: 如果多个线程同时访问对象StateObject,最后结果会如何呢?

            如下代码,StateObject定义共享对象,如果一个线程刚好运行到if(State==10),就被其它线程占用.调度器去运行另一个线程. 第二个线程进入If体,将State值增加,即此时State=11, 第一个线程再次被调用,进入If体,State再次被增加,即State=12.也就是说,只要存在State=12时,就发生竞态条件

      入口方法Main:

     1 static void Main(string[] args)
     2 {
     3    StateObject obj = new StateObject();
     4    for (int i = 0; i < 1000; i++)
     5    {
     6       System.Threading.Thread t = new System.Threading.Thread(obj.ChangeState);
     7       t.Name = "Thread" + i;
     8       t.Start();                
     9    }
    10    Console.WriteLine(obj.GetState.ToString());
    11    Console.Read();
    12 }

    StateObject类:

     1 public class StateObject
     2 {
     3     private int state = 1;
     4     public void ChangeState()
     5     {
     6        while(true)
     7        {
     8           if(state == 10)
     9           {
    10              state++;
    11              if (state == 12)
    12              {
    13                 Console.WriteLine(System.Threading.Thread.CurrentThread.Name + "   " + state);
    14              }  
    15           }
    16           state = 10;
    17        }
    18     }
    19     public int GetState
    20     {
    21        get { return state; }
    22        set { state = value; }
    23     }
    24 }

    运行结果:  用If(State = 12)来判断是否发生竞态条件

    Thread1  12

    Thread4  12 

    ......

    以上测试证明多线程在访问同一个对象时会发生竞态条件的可能, 要解决竞态条件,可以使用锁定共享对象的机制.   

  • 相关阅读:
    JavaScript(五)对象
    JavaScript(四)字符串类型
    JavaScript(三)数值类型
    JavaScript(二)数据类型
    JavaScript(一)基本语法
    ES6总结
    HBuilderX真机调试检测不到魅族手机
    安装Ubuntu 20.04 LTS服务器系统
    Windows进程通信(IPC)之共享内存
    C++代理模式的实现
  • 原文地址:https://www.cnblogs.com/ybhcolin/p/1834209.html
Copyright © 2011-2022 走看看