zoukankan      html  css  js  c++  java
  • Linux 竞态条件和临界区

    1. 临界区和竞态条件:

    临界区:访问和操作共享数据的代码段;

    竞态条件:当有多个线程同时进入临界区时,执行结果取决于线程的执行顺序;

    如下述代码,当多个线程同时调用func函数,对共享数据sum进行操作,实际上我们得到的结果则依赖于执行的相对时间;

    线程1在a.取出sum值,然后b.对sum+1,然后c.写入sum值,假设线程2在线程1a步骤之后同样取出sum值,并分别进行+1计算,写回sum值,可见,线程1和线程2计算的结果都是1,此时sum值为1;假设线程2在线程1写回数据之后,取出sum值,进行+1,写回操作,此时sum值为2;可见,线程的执行相对时间不同,导致了共享资源出现了不同结果;

    int sum = 0;
    
    ...
    
    void func ()
    {
      sum++;
    }
    
    ...

    2. 保护临界区:

    为了保护临界区,我们可使用互斥量、读写锁等同步措施,保证同一时间只有一个线程能够进入到临界区,或者同一时间只有一个写线程进入到临界区,从而避免产生竞态条件;

    int sum = 0;
    
    ...
    
    void func ()
    {
      lock();
      sum++;
      unlock();
    }
    
    ...
  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/5338186.html
Copyright © 2011-2022 走看看