zoukankan      html  css  js  c++  java
  • 多线程初级二( 同步基础之锁)

    https://blog.gkarch.com/threading/part2.html

    在线程间共享数据是造成多线程复杂、难以定位的错误的主要原因。尽管这通常是必须的,但应该尽可能保持简单。

    补充:

     线程安全

    排它锁用于确保同一时间只允许一个线程执行指定的代码段。主要的两个排它锁构造是lockMutex(互斥体)其中lock更快,使用也更方便。Mutex的优势是它可以跨进程的使用。

    lock 排他锁

    Monitor.Enter 和Monitor.Exit

    class ThreadUnsafe
    {
      static int _val1 = 1, _val2 = 1;
    
      static void Go()
      {
        if (_val2 != 0) Console.WriteLine (_val1 / _val2);
        _val2 = 0;
      }
    }

    这个类不是线程安全的:如果Go方法同时被两个线程调用,可能会产生除数为零错误,因为可能在一个线程刚好执行完if的判断语句但还没执行Console.WriteLine语句时,_val2就被另一个线程设置为零。

    下边使用lock解决这个问题:

    class ThreadSafe
    {
      static readonly object obj = new object();
      static int _val1, _val2;
    
      static void Go()
      {
        lock (obj)
        {
          if (_val2 != 0) Console.WriteLine (_val1 / _val2);
          _val2 = 0;
        }
      }
    }

    lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

    先来看看执行过程,代码示例如下:

    假设线程A先执行,线程B稍微慢一点。线程A执行到lock语句,判断obj是否已申请了互斥锁,

    判断依据是逐个与已存在的锁进行object.ReferenceEquals比较(此处未加证实),如果不存

    在,则申请一个新的互斥锁,这时线程A进入lock里面了。

    这时假设线程B启动了,而线程A还未执行完lock里面的代码。线程B执行到lock语句,检查到obj

    已经申请了互斥锁,于是等待;直到线程A执行完毕,释放互斥锁,线程B才能申请新的互斥锁并执行

    lock里面的代码。

  • 相关阅读:
    获取ip地址,
    手机div侧滑删除
    swiper左右选项卡滑动
    table-cell使用
    返回和刷新
    电脑浏览器计算高度和宽度
    css 空格
    时间js
    Nodejs仿Apache的部分功能
    Nodejs中的JavaScript
  • 原文地址:https://www.cnblogs.com/haigui-zx/p/14952890.html
Copyright © 2011-2022 走看看