zoukankan      html  css  js  c++  java
  • 20180517 线程

    两个线程并发执行以下代码,假设a是全局变量,初始为1,那么以下输出______是可能的?
    1
    2
    3
    4
    void foo(){
        a=a+1;
        printf("%d ",a);
    }
    3 2
    2 3
    3 3
    2 2

    正确答案: A B C D   你的答案: B C D (错误)

    • 编译出来(一般来讲)大概会是这么几步: 
      • 读a
      • +1
      • 写a
      • 再读a (这个可能被编译器优化掉)
      • 写到屏幕上

      两个线程,[1]和[2]: 


      • [1]读a
      • [1]+1
      • [1]写a // a =2
      • [1]再读a
      • [2]读a
      • [2]+1
      • [2]写a // a = 3
      • [2]再读a
      • [2]写到屏幕上 // 3_
      • [1]写到屏幕上 // 2_


      先执行所有[1]再执行所有[2]就得到B了。


      • [1]读a
      • [1]+1
      • [1]写a // a = 2
      • [2]读a
      • [2]+1
      • [2]写a // a = 3
      • [1]再读a
      • [2]再读a
      • ...
      就得到3_3_了,但如果没有再读a的步骤,就是_2_3或者_3_2了。 


      • [1]读a
      • [2]读a
      • [1]+1
      • [2]+1
      • [1]写a // a = 2
      • [2]写a // a = 2
      • ....
      就得到2_2_了
  • 相关阅读:
    php数据类型
    php输出语句
    php学习知识点框架
    php变量
    php语法
    php 的开发工具
    搭建php环境的几种方法
    redis 的单机安装
    三、其他主机安装zabbix-agent加入到zabbix
    内核参数优化
  • 原文地址:https://www.cnblogs.com/kxzh/p/9107673.html
Copyright © 2011-2022 走看看