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();
    }
    
    ...
  • 相关阅读:
    阿里云Centos 8.2安装LNMP环境
    TP6中缓存的使用
    TP6中命令行
    TP6中请求和响应
    TP6模型操作
    TP6中数据库操作
    TP6中验证器的使用
    TP6如何使用文件上传
    3. Longest Substring Without Repeating Characters
    1. Two Sum
  • 原文地址:https://www.cnblogs.com/wanpengcoder/p/5338186.html
Copyright © 2011-2022 走看看